【发布时间】:2013-10-06 03:56:55
【问题描述】:
我正在将一个项目迁移到 c++,因为我在用 c# 开发它时遇到了性能上限。然而,这是我第一次使用 c++,我发现自己做了很多看起来不太正确的事情......
考虑以下抽象示例:
class ClassC
{
ClassC::ClassC(int option)
{
//do something
}
}
class ClassB
{
ClassC* objC
ClassB::ClassB(ClassC* objC)
{
this->objC = new ClassC(*objC);
}
}
class ClassA
{
void functionA(void)
{
ClassB objB (&ClassC(2));
}
}
ClassA 有一个创建 ClassB 的函数。 ClassB 的构造函数接受一个 ClassC,objC。 objC 通过引用传递,因为 ClassC 不是原始类型,而是通过引用存储,因为 ClassC 没有默认构造函数。但是,由于objC是在静态内存中创建的,并且会在functionA完成时被销毁,所以ClassB需要将objC指向的值复制到动态内存中,然后存储一个指向该副本的指针。
这对我来说似乎很绕,让我觉得我在错误地接近某些东西。这是 c++ 中的标准操作吗?
编辑:每个人似乎都在说 ClassB objB (&ClassC(2)); 行不正确,因为 ClassC 对象的值将在 ClassB 复制它之前丢失。但是我已经编译了我的示例,但事实并非如此。这是修改后的工作代码:
class ClassC
{
int option;
public:
ClassC::ClassC(int option)
{
this->option = option;
}
int ClassC::getOption(void)
{
return option;
}
};
class ClassB
{
ClassC* objC;
public:
ClassB::ClassB(ClassC* objC)
{
this->objC = new ClassC(*objC);
}
int ClassB::getOption(void)
{
return objC->getOption();
}
};
class ClassA
{
public:
static ClassB functionA(void)
{
return ClassB (&ClassC(2));
}
};
int main(void)
{
ClassB objB = ClassA::functionA();
int test = objB.getOption(); //test = 2, therefore objC was copied successfully.
return 0;
}
【问题讨论】:
-
您是否遇到任何错误?它们是什么?
-
ClassB objB (&ClassC(2));这里取的是临时地址。这不是一件好事。 -
您需要了解对象生命周期和所有权语义。在
c#,这些事情你不必担心。 -
1.如果可以避免,请不要使用指针。 2. 传递 const ref 而不是指针
-
除了模糊的建议之外,很难建议如何处理示例代码,因为您的意图并不十分清楚。