b***y 发帖数: 2799 | 1 ☆─────────────────────────────────────☆
nochoice (别无选择) 于 (Tue Sep 20 21:56:36 2005) 提到:
我有一个小问题(对各位高手来说)。
我声明一个类
class a{
int **b;
void do()
{
b[0][0].....;
}
...
}
我想这样用,好像不行
void main()
{
int b[2][3]={.....};
a *test=new a;
test->b=b;
test->do();
}
我想主程序里面声明一个多维数组(不定大小的),然后用对象里面的指针指向这个多维数
组引用,这样省了构造函数再分配空间.
有没有什么好办法实现?
☆─────────────────────────────────────☆
oOOo (\_/o!o\_/) 于 (Tue Sep 20 22:41:12 2005) 提到:
first, int**b should be public
a |
|
s*****k 发帖数: 604 | 2 比如一个object array, 要再加长点,
C里面用realloc,但是realloc不调用构造函数 |
|
k***n 发帖数: 20 | 3 class A {
private:
...
public:
A();
A(const char x, const char y);
A(const string& z);
...
}
int main () {
A aa;
const string str("AT");
aa(str);
return 0;
}
gcc编译提示:
no match for call to `(A) (const std::string&)'
我知道这个错误可能很低级,不吝求教。 |
|
S*********g 发帖数: 5298 | 4 你这个aa(str) call 的不是costructor
constructor是在
A aa;
这一行的时候执行的 |
|
|
e****d 发帖数: 333 | 6 你实际上在用 operator overloading
#include
#include
using namespace std;
class A{
string _str;
public:
A(){}
A(const string& z):_str(z){}
void operator()(const string& z){_str=z;}//(*)
string get() const{return _str;}
};
int main () {
A aa;
const string str("AT");
aa(str);
cout<
}
(*)行返回值不是void的时候,基本就是functional object了。 |
|
X****r 发帖数: 3557 | 7 任何构造函数都可以,包括copy constructor。
如果你在代码中可以写
A a(一坨参数);
那么对于B的成员a就可以写B::B():a(一坨参数) {}
当然,这个也一样要受access control的限制。 |
|
|
z****e 发帖数: 2024 | 9 我说得不明白,
我是想说,这样做好不好?
因为如果:
A( ):_i(0){
int* p=new int[10];
throw(type1);
}
那么这个mem leak怎么办呢?
不知道问题问的对不对。 |
|
p***o 发帖数: 1252 | 10 That's where you need an auto_ptr. |
|
z****e 发帖数: 2024 | 11 哦,原来这里是我们以前那个故事的结局?
除了auto_ptr没有其他解决办法了吗? |
|
p***o 发帖数: 1252 | 12 Well, you can write your own, as long as the class frees the resource
upon destruction. |
|
z****e 发帖数: 2024 | 13 but in the case i wrote, the constructor is not finished, so the destructor
will not be called, right? |
|
|
p***o 发帖数: 1252 | 15 class A
{
your_class obj_;
public:
A() : obj_(new int)
{
throw;
}
};
When A::A() throws, the compiler will make sure the 'partially'
constructed A will be 'partially' destructed. In this case,
the destructor of obj_ will be called, give you a chance to
release any resource acquired by obj_.
destructor |
|
p***o 发帖数: 1252 | 16 Just want to let him know you mean A::~A() will not be called ;) |
|
z****e 发帖数: 2024 | 17 明白了。
我理解是,如果一定要在ctr里边throw,而throw之前还要申请内存,就把那个要申请
内存的指针包装起来,不能是一个裸体指针,应该是一个被包装好的对象。例如auto_
ptr.
对吧。 |
|
t****t 发帖数: 6806 | 18 1. stack unwinding will be performed.
2. result of 1: full constructed auto objects and subobjects will be full de
structed. partially constructed objects will not be destructed, but memory w
ill be released. |
|
|
|
e**u 发帖数: 409 | 21 可能是因为那个Foo(x)里面的new会调用什么拷贝构造函数啥的吧 |
|
z****e 发帖数: 2024 | 22 好像说变量数目还是变化的,初始化列表怎么写?
好像是这个问题。
因为以后code的维护,不能每次加一个变量,就重写一次列表?
还有谁记得这个题目? |
|
|
z****e 发帖数: 2024 | 24 class refc{
public:
refc():cnt(1){cout<<"refc ctr: "<
refc(const refc& x):cnt(x.cnt){++cnt;cout<<"refc cp-ctr: "<
refc& operator=(const refc& x){
cnt=x.cnt;
++cnt;
cout<<"refc op= "<
return *this;
}
~refc(){--cnt;
cout<<"refc dtr "<
}
void nul(){}
private:
int cnt;
};
refc f10(){
refc k;
cout<<"k exist()"<
return k;
}
int main(int argc, char* argv[ ]){
refc x=f10();
}
》
refc ctr: 1
k exist()
refc dtr |
|
k*****2 发帖数: 252 | 25 你用的是g++吧
VC2008的输出就不一样:
refc ctr: 1
k exist()
refc cp-ctr: 2
refc dtr 0
refc dtr 1 |
|
S**I 发帖数: 15689 | 26 do you know the difference between:
int a=1;
and
int a;
a=1; |
|
k*****2 发帖数: 252 | 27 楼主难道想要问的不是copy ctor?而是op= |
|
S**I 发帖数: 15689 | 28 guess you run it under debug mode? try running it under release mode. |
|
S**I 发帖数: 15689 | 29 isn't his question "why x is initialized without constructor being called?" |
|
|
|
S**I 发帖数: 15689 | 32 应该是这样了,对比一下VS下面的debug和release mode的输出结果就看得出来。 |
|
X****r 发帖数: 3557 | 33 The result of f10 is directly constructed on x, i.e. k and
x are at the same location. This optimization is allowed by
the standard. An example can be found in 12.2 [class.temporary]
(2).
"< |
|
|
|
D****A 发帖数: 360 | 36 I hate C++. so many subtleties ...
This might be so called return value optimization
what about change the return type of f10() to refc& |
|
|
p***o 发帖数: 1252 | 38 But his code violated the semantics of the copy ctor first ... |
|
|
p***o 发帖数: 1252 | 40 也就是说既然x从k用copy ctor得来,为什么在k的生命期结束的时候
x不能直接把k拿来用呢?如果不能,那就说明你在copy ctor里做了一
些不该做的事情,以至于x和k的内部状态不一样。 |
|
|
c*r 发帖数: 278 | 42 Copy ctor shall only create a COPY of an existing object |
|
X****r 发帖数: 3557 | 43 不是一直就在说这个吗?编译器把x和k优化成同一个对象了,这个优化是C++允许的。 |
|
a*****i 发帖数: 268 | 44 我理解这里面有两个优化:
1.k和f10()返回值共用空间
2.k和x共用空间
第一个优化很普遍,第二个优化比较不普遍。VC里面debug模式作第一个不做第二个。 |
|
|
s*****g 发帖数: 5159 | 46 我以前是用C的,C++的理解停留在C++标准制定以前的水平,99年本科学的,那时候没
教STL,应该是当
时刚刚确定STL的标准。
我这个蹩脚C++程序员学的,如果构造函数有
new / malloc
析构就要自己写
delete / free
一个类的实例用完以后要delete其指针。
这些年做算法研究一下落伍了,这些新的STL需要找工作了才重新学。汗颜啊。 |
|
B*******g 发帖数: 1593 | 47 VC下面的
你说explicit ctor 编译报错的话倒也合理
auto_ptr test= new Base;
应该是试图从Base* implicitly构建一个 auto_ptr 然后用这个来初始化test (
就是
copy ctor了)
不过我才发现
struct auto_ptr_ref
{ // proxy reference for auto_ptr copying
explicit auto_ptr_ref(_Ty *_Right)
: _Ref(_Right)
{ // construct from generic pointer to auto_ptr
ptr
}
_Ty *_Ref; // generic pointer to auto_ptr ptr
};
auto_ptr_ref的构造函数也是explicit的。。那之前它如何implicitly构建了
auto_ptr_ref然后调用auto_ptr(auto_ptr_ |
|
|
|
j********x 发帖数: 2330 | 50 operator+的参数可以通过隐式调用string的构造函数获得,但是两个const char*就不
行了 |
|