C++ C++;是否在自定义类/结构的数组构造函数中获取数组键?

C++ C++;是否在自定义类/结构的数组构造函数中获取数组键?,c++,arrays,array-key,C++,Arrays,Array Key,如果我有这样一个简单的类: class MyClass { MyClass(){} ~MyClass(){} public: int myArrayKeyValue; }; 稍后,我创建了一个包含以下类的数组: MyClass testing[10]; 在构造函数中,如何访问数组键,以便为数组的每个元素设置适当的myArrayKeyValue?所以我得到这个: testing[0].myArrayKeyValue = 0; testing[1].myArrayK

如果我有这样一个简单的类:

class MyClass
{
    MyClass(){}
    ~MyClass(){}
public:   
    int myArrayKeyValue;
};
稍后,我创建了一个包含以下类的数组:

MyClass testing[10];
在构造函数中,如何访问数组键,以便为数组的每个元素设置适当的
myArrayKeyValue
?所以我得到这个:

testing[0].myArrayKeyValue = 0;
testing[1].myArrayKeyValue = 1;
testing[2].myArrayKeyValue = 2;
testing[3].myArrayKeyValue = 3;
etc...
是否可以在构造函数中完成此操作?或者我必须在数组中循环并手动赋值吗

是否可以在构造函数中完成此操作

没有

或者我必须在数组中循环并手动赋值吗

对。尽管您可以重新设计,这样就不需要了解这些实例内外的索引

可能的替代办法包括:

  • map
  • a
    设置
    ,键值为排序标准

您不能直接从构造函数执行此操作;它无法访问对象在数组中的位置。您必须编写一个循环来进行初始化

或者——我甚至对提到这一点都有点反感——使用从构造函数递增的全局或静态计数器。施工顺序保证从阵列开始到结束,因此这在技术上是可行的。但这太可怕了


(顺便说一句,您的示例中的构造函数是私有的,因此数组声明甚至不会编译。)

在构造函数中递增的简单的基于零的
静态
成员就可以了。但在创建数组之前,您需要重置它。这是否是一个好主意是一个完全不同的主题:)

您还可以使用静态计数器,如下所示:

class MyClass {
    static size_t static_counter;

    size_t m_value;
public:
    MyClass() {
        m_value = static_counter++;
    }

    inline static void reset() {
        static_counter = 0;
    }

    inline size_t get_value() const {
        return m_value;
    }
};

size_t MyClass::static_counter = 0;
但是您有责任手动重置,否则将发生内存主动变更。这可以通过在更高级别进行封装(在析构函数中重置)来纠正


编辑:我的想法与Nikolai N Fetissov相同,并且预期:在多线程程序中不能使用静态成员。

类似的事情是可能的:

class MyClass { 
public: 
  MyClass(int index) { myArrayKeyValue = index; } 
  ~MyClass();
private:
int myArrayKeyValue;
}; 

int main() 
{ 
  MyClass testing[5] = { MyClass(1), MyClass (2), 
                   MyClass (3), MyClass (4), MyClass (5) };

  return 0; 
}

考虑你想要的最终结果,并试图用其他方法来实现它可能是有价值的。

一种方法是:

std::vector<MyClass> v;
for (size_t i=0; i<nCount; i++)
    v.push_back(MyClass(static_cast<int>(i)));
std::vector v;

对于(size_t i=0;这是一个灾难的配方。如果你需要在两个不同的线程中同时执行算法怎么办?嗯,不是所有的代码都是线程化的。但我没说这是个好主意,是吗?:)如果他建立了自己的操作系统怎么办?请不要投票否决适合所给信息的解决方案。如果它是多线程的,他会使它精确化。问题是语言允许你解决这个问题。它还允许你在。。。脚您应该更清楚,然后在线程化代码中使用未受保护的
静态
成员。然后你还应该在扣动扳机之前阅读问题和答案。哦,好吧,现在的孩子:)这对我的阅读不好,我看不到它应该在多线程中使用的任何地方(如果不是,如果我们知道它不会,我们可以选择非保护静态)。。。不管怎么说,显然你挽回了你的反对票,所以我想我们很清楚:)反对票?你肯定不会鼓励其他人用测试过的代码来回答问题。这种类型的静态初始化不是一个好的解决方案。是的,这是可能的,它会工作,但正是因为你提到的原因,它是不好的。只有当程序注定是多线程的,而且最重要的是,如果我们不知道我们在做什么,它才是不好的。为什么要否决一个明确显示其弱点的解决方案?这取决于主题的创建者选择它,无论它是单线程还是多线程。如果多线程编程实践不好,而且越来越普遍,那么你为什么要给出答案,尤其是当你不知道他试图使用它的上下文时?静态初始化不好,简单明了。它的用途是有限的,但这不是其中之一。我否决了它,原因与我否决它的原因相同,因为它解释了为什么这是一个坏主意。对不起,我懒得重复一遍,我想解释清楚了。可能,但显然没有浓缩:/你能写(或复制/粘贴)吗有多少实例就有多少显式构造?这取决于是否有人想要初始化具有不同值的对象数组,而不是使用循环序列。这将是循环解决方案(对我来说最好,但他似乎想要一种构造方法),但在这种情况下,myArrayKeyValue应该直接为size\t,避免静态强制转换,例如大于2^15的值(大小等于无符号整数)。