在C++中,无法在初始化列表中初始化数组成员,因此成员对象应该具有默认构造函数,并且应该在构造函数中正确初始化它们.除了不使用数组之外,还有(合理的)解决方法吗?
[任何可以使用初始化列表初始化的东西在我们的应用程序中远比使用构造函数更好,因为这些数据可以由编译器和链接器分配和初始化,并且每个CPU时钟周期都很重要,甚至在此之前main.但是,并不总是可以为每个类都有一个默认的构造函数,而且,在构造函数中再次重新初始化数据反而无法实现目的.]
例如,我想要这样的东西(但这个不起作用):
class OtherClass {
private:
int data;
public:
OtherClass(int i) : data(i) {}; // No default constructor!
};
class Foo {
private:
OtherClass inst[3]; // Array size fixed and known ahead of time.
public:
Foo(...)
: inst[0](0), inst[1](1), inst[2](2)
{};
};
Run Code Online (Sandbox Code Playgroud)
我所知道的唯一解决方法是非阵列的:
class Foo {
private:
OtherClass inst0;
OtherClass inst1;
OtherClass inst2;
OtherClass *inst[3];
public:
Foo(...)
: inst0(0), inst1(1), inst2(2) {
inst[0]=&inst0;
inst[1]=&inst1;
inst[2]=&inst2;
};
};
Run Code Online (Sandbox Code Playgroud)
编辑:应该强调的是OtherClass,没有默认构造函数,并且非常希望链接器能够分配所需的任何内存(Foo将创建一个或多个静态实例),使用堆基本上是禁止的.我已经更新了上面的例子,以突出第一点.
如何使用GNU ld将(某些)符号链接到特定的固定地址,以便二进制文件仍可在Linux(x86)中正常执行?不会访问这些符号,但它们的地址很重要.
例如,我有以下结构:
struct FooBar {
Register32 field_1;
Register32 field_2;
//...
};
struct FooBar foobar;
Run Code Online (Sandbox Code Playgroud)
我想链接foobar到地址0x76543210,但通常链接标准库和应用程序的其余部分.然后,应用程序将使用foobar的地址,但不会引用它后面的(可能不存在的)内存.
这个请求的基本原理是这个相同的源可以在两个平台上使用:在本机平台上,Register32可以简单地是一个volatile uint32_t,但在Linux上Register32是一个C++对象,其大小与uint32_t定义的大小相同operator=,然后将使用该地址对象并向具有该地址(和数据)的通信框架发送请求以在远程硬件上执行实际访问.因此,链接器将确保Register32结构的字段引用正确的"地址".
如何ListCollectionView.AddNew确定它创建的对象的类型,以及如何影响它?
我有一些类型(Base,DerivedA和DerivedB)的层次结构,目前我的WPF工具包DataGrid创建DerivedA对象(为什么,我不知道 - 可能是因为网格中的几乎所有数据都属于那种类型),但我会喜欢它来创建DerivedB对象.
更新:我已经尝试从中获取新类ListCollectionView并AddNew为其实现一个新方法,现在我几乎就在那里:唯一剩下的问题是在添加新项后,没有添加新的新项占位符,所以我只能添加一个项目.我目前的方法看起来有点像这样:
public class CustomView : ListCollectionView, IEditableCollectionView
{
public CustomView(System.Collections.IList list)
: base(list)
{
}
object IEditableCollectionView.AddNew()
{
DerivedB obj = new DerivedB();
InternalList.Add(obj);
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)