作者gn00618777 (非常念旧)
看板C_and_CPP
标题Re: [问题] template 用法
时间Sun Apr 24 22:12:03 2016
※ 引述《gn00618777 (非常念旧)》之铭言:
: 最近在 trace android 的 code ,里面有些 c++ 的程式,写了一小段来验证
: #include<iostream>
: #include<stdlib.h>
: using namespace std;
: template<typename T>
: class Demo{
: public:
: Demo(T* other);
: Demo(const Demo<T>& other);
: };
: template<typename T>
: Demo<T>::Demo(T* other){
: cout<<"This is the First constructor"<<endl;
: }
: template<typename T>
: Demo<T>::Demo(const Demo<T>& other){
: cout<<"This is the second constructor"<<endl;
: }
: int main(){
: int *ptr;
: Demo<int> p; // 会 error,因为它会找不到 Demo() 建构子,这个合理~
: Demo<int> p = ptr; //这边他会 call Demo(T* other) 这边的建构子
: //不太懂为啥他会call 第一个建构子呢?
: //如果用 Demo<int> p(ptr); 还比较容易理解..
: }
: 谢谢
板友提供的关键字 copy initialization,让我大概了解
int *ptr;
Demo<int> p = ptr; --> 会去判断等号右边的型态,进而去寻找 Demo 中符合
的建构子,ptr 是一个指标,所以去 call Demo(T*other)
在Android源码常会看到下面写法
sp<Camera> c = new Camera();
不太懂 c 的意义是甚麽,代表可以用c去存取 Camera类别内的方法吗?我去试下面
范例 code
Camera 用 myClass 取代, sp 用 Demo 取代
class Demo{
public:
Demo(T* other);
Demo(const Demo<T>& other);
};
template<typename T>
Demo<T>::Demo(T* other){
cout<<"This is the First constructor"<<endl;
}
template<typename T>
Demo<T>::Demo(const Demo<T>& other){
cout<<"This is the second constructor"<<endl;
}
class myClass{
public:
myClass():a(0){}
int getA(){return a}
private:
int a;
};
int main(){
Demo<myClass> c = new myClass(); // call Demo(T * other) 建构子没问题
cout<<c->getA()<<endl; // 这边就错了,也许我搞不清楚 c 到底是甚麽
// [Error] base operand of '->' has non-pointer type 'sp<myClass>'
}
能否板友再指点我一下呢...谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 58.115.110.72
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1461507127.A.85C.html
※ 编辑: gn00618777 (58.115.110.72), 04/24/2016 22:14:35
1F:→ Caesar08: Demo class templace没有getA的data member function 04/24 22:24
2F:→ bibo9901: 跟template无关 纯粹是你没弄清楚物件的用法 04/24 22:25
3F:→ bibo9901: -> 是给指标用的. c不是指标当然不能用 04/24 22:26
4F:→ gn00618777: new 这个用法是传回记忆体位址,所以我很自然的把 c 04/24 22:32
5F:→ gn00618777: 当成一个指标去接这位址... 04/24 22:33
6F:→ gn00618777: 以Demo<myClass> 宣告的 c 看起来是一个物件 04/24 22:34
7F:→ gn00618777: c 去接这个位址整个就不通 04/24 22:35
8F:推 BlazarArc: 我不知道android source code, 不过那个sp看起来就很像 04/24 23:22
9F:→ BlazarArc: smart pointer? 04/24 23:22
10F:→ BlazarArc: smart pointer会去overload -> operator 04/24 23:24
11F:→ gn00618777: 是的,他是个smart point,也有看到它overload -> 04/24 23:36
12F:→ gn00618777: overload operator -> 的用法应该是 c-> 成员 04/24 23:39
13F:→ gn00618777: 我不解的是 new myClass 这个记忆体位址,它在 sp 内 04/24 23:39
14F:→ gn00618777: 它是如何被指定到 sp 类别的哪些成员变数或是某些操作 04/24 23:40
16F:→ BlazarArc: Built-in member access operators 04/24 23:58
17F:→ BlazarArc: If a user-defined operator-> is provided ... 04/24 23:58