我正在使用一个已经将new运算符设为私有的类,因此获取实例的唯一方法是编写
Foo foo = Foo()
Run Code Online (Sandbox Code Playgroud)
写作
Foo* foo = new Foo()
Run Code Online (Sandbox Code Playgroud)
不起作用.
但是因为我真的想要一个指向它的指针,我用以下方法模拟它:
Foo* foo = (Foo*)malloc(sizeof(Foo));
*foo = Foo();
Run Code Online (Sandbox Code Playgroud)
这样可以测试指针是否为null,以确定是否已经初始化.
从经验测试来看,它看起来很有效,但是malloc可能没有分配足够的空间吗?或者其他东西变得有趣?
---编辑---
A没有提到上下文,因为我实际上并不确定新运算符被禁用的原因.这个类是约束编程库(gecode)的一部分,我认为可以禁用它以强制指定模型的文档化方式.
我不知道混凝土数据类型的习语,这看起来更合理.
在指定标准模型时,该分配方案可能没有问题 - 其中所有内容都在空间派生类中被指定为CDT--但在我的情况下,这些实例都是由特定类创建的,然后通过引用传递给表示模型的类的构造函数.
关于我没有使用的原因
Foo f;
Foo *pf = &f;
Run Code Online (Sandbox Code Playgroud)
这就像做下面的情况1,它会抛出"返回对局部变量的引用"警告
int& f() { int a=5; return a; } // case 1
int& f() { int a=5; int* ap=&a; return *ap; }
int& f() { int* ap=(int*)malloc(sizeof(int)); *ap=5; return *ap; }
Run Code Online (Sandbox Code Playgroud)
在案例2中添加指针时,此警告消失,但我想这是因为编译器丢失了轨道.
因此,剩下的唯一选择是案例3(没有提到另外一个,ap是一个类的成员,只有在调用f时才会初始化一次,否则将为null,并且是唯一返回对它的引用的函数.这样,我确信ap在这种情况下,由于编译器优化它而失去意义(可能会发生吗?)
但我想这远远超出了原来问题的范围......
不要malloc与C++类一起使用. malloc不同于调用类的构造函数new的非常重要的方面new,但malloc不是.
您可以通过几种方式获得指针,但首先要问问自己为什么?您是否尝试动态分配对象?你是否试图将指针传递给其他函数?
如果你传递指针,你可能最好不要传递引用:
void DoSomething(Foo& my_foo)
{
my_foo.do_it();
}
Run Code Online (Sandbox Code Playgroud)
如果你真的需要一个指针(也许是因为你无法改变它的实现DoSomething),那么你可以简单地将指针指向一个自动:
Foo foo;
DoSomething(&foo);
Run Code Online (Sandbox Code Playgroud)
如果你需要动态分配Foo对象,事情会变得有点棘手.有人做了这个new操作private是有原因的.可能是一个非常好的理由.可能有一个工厂方法Foo:
class Foo
{
public:
static Foo* MakeFoo();
private:
};
Run Code Online (Sandbox Code Playgroud)
..在这种情况下你应该称之为.否则你将不得不编辑Foo自己的实现,这可能不是一件容易的事情或者是一件好事.
| 归档时间: |
|
| 查看次数: |
1595 次 |
| 最近记录: |