C++ 从静态方法创建实例

C++ 从静态方法创建实例,c++,methods,static-methods,C++,Methods,Static Methods,假设我希望我的用户只使用一个类,比如SpecialData。 现在,这个数据类将有许多方法,根据数据的类型,这些方法在内部执行不同的操作,但在外部返回相似的结果。因此,我希望有一个“公共”类和其他“私有”子类来改变方法的行为等等 对于某些类型的数据来说,这将是非常简单的,这些数据需要进行如下构建: SpecialData& sm = SpecialData::new_supermatrix(); 而new_supermatrix()将返回一个supermatrix实例,它继承了Spec

假设我希望我的用户只使用一个类,比如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&”类型的非常量引用无效


那么,有什么想法吗?

您需要实际使用
新的
操作符。通过
返回超级矩阵(矩阵默认值大小、10001239、FLOAT32等)得到的创建在堆栈上分配对象,当函数返回时(它在同一行中执行),堆栈将被清除。使用
new
会在堆上分配它。

您需要实际使用
new
操作符。通过
返回超级矩阵(矩阵默认值大小、10001239、FLOAT32等)得到的创建在堆栈上分配对象,当函数返回时(它在同一行中执行),堆栈将被清除。使用
new
会将其分配到堆上。

简单回答-您不能使用这样的引用。您的NeXySubMeMatlab函数返回一个无名的临时值,尝试绑定到非const引用-C++,这样只允许这些值绑定到const引用。如果你想写这样的函数,你需要让它们返回一个指向动态分配对象的指针,或者坚持返回一个值,但是在调用代码中将返回值分配给另一个值。

简单回答-你不能使用这样的引用。您的NeXySubMeMatlab函数返回一个无名的临时值,尝试绑定到非const引用-C++,这样只允许这些值绑定到const引用。如果你想写这样的函数,你需要让它们返回一个指向动态分配对象的指针,或者坚持返回一个值,但将返回值分配给调用代码中的另一个值。

这段代码有几个问题。首先,您可能希望在这里使用指针而不是引用。像在
新超级矩阵中那样返回对堆栈上创建的对象的引用几乎会立即导致崩溃。它需要分配
new
,并作为指针传回,如果这是您想要的,但我不确定您正试图做什么。但无论如何,这就是导致错误的原因,您正在返回对临时变量的引用。

此代码有几个问题。首先,您可能希望在这里使用指针而不是引用。像在
新超级矩阵中那样返回对堆栈上创建的对象的引用几乎会立即导致崩溃。它需要分配
new
,并作为指针传回,如果这是您想要的,但我不确定您正试图做什么。但无论如何,这就是导致错误的原因,您正在返回对临时变量的引用。

在您的方法中,您可以使用
静态

SpecialData& SpecialData::new_supermatrix()(){
  static SuperMatrix supermatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
  return supermatrix;
}

在您的方法中,可以使用
静态

SpecialData& SpecialData::new_supermatrix()(){
  static SuperMatrix supermatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
  return supermatrix;
}

不能返回对临时/本地对象的引用


<>这一点和许多其他常见的错误在迈尔斯的书中解释为:有效C++。

您不必返回对临时/本地对象的引用。< /P>
<>这一点和许多其他常见的错误在迈尔斯的《有效C++》中解释过。

你返回一个临时对象的引用,这是坏消息,因为一旦你的方法退出,对象就不再存在了。
仔细阅读。最接近您想要做的是模式。

您返回了对临时对象的引用,这是个坏消息,因为一旦方法退出,对象就不再存在了


仔细阅读。最接近你想要做的是模式。

好吧,你有三个选择:

a) 无论如何,您只希望有一个超级矩阵实例。然后按照已经建议的方式,选择静态函数成员路由

b) 您希望创建多个实例。然后必须返回指针而不是引用,并使用new(即
returnnewsupermatrix(…)
创建对象

c) 作为选项b的替代方案,您还可以仅返回一个对象,即

SpecialData SpecialData::new_supermatrix()(){
return SuperMatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
}
但是,这需要一个(深度)复制操作符(默认的操作符通常不够),这意味着在堆栈上创建对象,然后进行复制并返回该副本。好的是,如果您没有将结果实际接收到变量中,这不会泄漏内存。坏的是,如果对象非常大,这可能会非常耗费内存和时间


无论您打算用它做什么,这些解决方案在技术上和逻辑上都是相互排斥的

你有三个选择:

a) 无论如何,您只希望有一个超级矩阵实例。然后按照已经建议的方式,选择静态函数成员路由

b) 您希望创建多个实例。然后必须返回指针而不是引用,并使用new(即
returnnewsupermatrix(…)
创建对象

c) 作为选项b的替代方案,您还可以仅返回一个对象,即

SpecialData SpecialData::new_supermatrix()(){
return SuperMatrix(MATRIX_DEFAULT_MAGNITUDE,1000,1239,FLOAT32,etc...);
}
但是,这需要一个(深度)复制操作符(默认的操作符通常不够),并且