gpt4 book ai didi

c++ 指针参数 : does it make sense to create a copy of the value pointed too, 然后再次将拷贝存储为指针?

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:03 24 4
gpt4 key购买 nike

我正在将一个项目迁移到 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;
}

最佳答案

不确定您真正的问题是什么,但您的代码似乎很脆弱。我想重写您的代码,如您所示:

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++ 指针参数 : does it make sense to create a copy of the value pointed too, 然后再次将拷贝存储为指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com