我正在将项目迁移到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/

10-11 22:13