假设我希望我的用户只使用一个类,比如说SpecialData。 现在,这个数据类将有许多方法,并且根据数据类型,这些方法在内部执行不同的操作,但返回外部类似的结果。因此,我希望有一个“公共”类和其他“私人”,子类可以改变方法的行为等...
对于需要构建的某些类型的数据来执行类似的操作会更加简单:
SpecialData& sm = SpecialData::new_supermatrix();
和new_supermatrix()将返回一个SuperMatrix实例,该实例继承了SpecialData的大多数行为。
我的标题:
static SpecialData& new_supermatrix();
我的cpp:
SpecialData& SpecialData::new_supermatrix()(){
return SuperMatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
}
问题是,我得到了这个错误,由于这种情况,这可能是合乎逻辑的:
从'SpecialData'类型的临时值初始化'SpecialData&'类型的非const引用
那么,有什么想法吗?
答案 0 :(得分:3)
嗯,你有三个选择:
a)你想要只有一个SuperMatrix实例。然后按照已经建议的那样去静态函数成员路由。
b)您想要创建多个实例。然后你有返回一个指针而不是引用,并用new创建对象(即return new SuperMatrix(...)
。
c)作为选项b的替代方案,您也可以仅返回一个对象,即
SpecialData SpecialData::new_supermatrix()(){
return SuperMatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
}
但是,这需要一个(深层)复制操作符(默认值不常用),这意味着该对象是在堆栈上创建的,然后被复制并返回该副本。好处是,如果你实际上没有将结果收到变量,这不会泄漏内存。不好的是,如果对象非常大,这可能非常耗费内存和时间。
无论您将如何处理,这些解决方案在技术和逻辑上都是互相排斥的。 ;)
答案 1 :(得分:2)
简单回答 - 您不能使用这样的引用。你的new_supermatrix函数返回一个无名的临时值,你尝试绑定到非const引用--C ++只允许将这些值绑定到const引用。如果你想编写这样的函数,你需要让它们返回一个指向动态分配对象的指针,或者坚持返回一个值,但是将返回值赋给调用代码中的另一个值。
答案 2 :(得分:1)
此代码有几个问题。首先,您可能希望在此处使用指针而不是引用。像在new_supermatrix
中那样返回对堆栈上创建的对象的引用几乎会立即导致崩溃。它需要分配new
并作为指针传回,如果这是你想要的,但我不确定你想要做什么。但无论如何,这是导致错误的原因,您将返回对临时变量的引用。
答案 3 :(得分:0)
您需要实际使用new
运算符。您通过return SuperMatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
获得的创建将在堆栈上分配对象,该函数在函数返回时清除(它在同一行中执行)。使用new
会导致它在堆上分配。
答案 4 :(得分:0)
在您的方法中,您可以使用static
:
SpecialData& SpecialData::new_supermatrix()(){
static SuperMatrix supermatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
return supermatrix;
}
答案 5 :(得分:0)
您不得返回对临时/本地对象的引用。
这一点以及许多其他常见的错误将在Meyers的书中解释, Effective C ++ 。
答案 6 :(得分:0)
您正在返回对临时对象的引用,这是个坏消息,因为一旦您的方法退出,该对象就不再存在了。
阅读creational design patterns。看起来与您想要做的最接近的是Factory Method模式。