我正在将项目迁移到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));
行是不正确的,因为在ClassB可以复制它之前,ClassC对象的值将丢失。但是我已经汇编了我的示例,事实并非如此。修改后的工作代码为: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;
}
最佳答案
不知道您真正的问题是什么,但是您的代码似乎很脆弱。如您所显示的那样,我想重写您的代码:
class ClassC
{
explicit ClassC(int option)
// ^^^^^^^^ stop implicit conversion, if constructor takes one parameter
{
//do something
}
};
class ClassB
{
ClassC objC; // store by value instead of pointer.
// Even smart pointer will be better option than raw pointer
explicit ClassB(const ClassC& objC) // pass by const reference instead
: objC(objC) // use member initializer list to initialize members
{
}
};
class ClassA
{
void functionA(void)
{
ClassB objB(ClassC(2));
}
};
关于c++ - c++指针参数:是否也创建了指向的值的拷贝,然后将该拷贝再次存储为指针,是否有意义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19205256/