从静态方法创建实例

时间:2010-06-03 19:57:53

标签: c++ methods static-methods

假设我希望我的用户只使用一个类,比如说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引用

那么,有什么想法吗?

7 个答案:

答案 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模式。