代码之家  ›  专栏  ›  技术社区  ›  Jake Wilson

C++在自定义类/Struts数组的构造函数中获得数组密钥?

  •  1
  • Jake Wilson  · 技术社区  · 15 年前

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

    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...
    

    有没有可能在构造器中实现这一点?或者我必须在数组中循环并手动赋值吗?

    6 回复  |  直到 15 年前
        1
  •  3
  •   Georg Fritzsche    15 年前

    有没有可能在构造器中实现这一点?

    不。

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

    不需要 里面的索引知识 在这些实例之外。

    • map<int, MyClass>
    • set<MyClass> 键值是排序标准
        2
  •  0
  •   Thomas    15 年前

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

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

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

        3
  •  0
  •   Nikolai Fetissov    15 年前

    简单零基 static 在构造函数中递增的成员应该执行。不过,在创建数组之前需要重置它。这是否是一个好主意是一个完全不同的话题:)

        4
  •  0
  •   cpx    15 年前

    这样的事情是可能的:

    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; 
    }
    
        5
  •  0
  •   Sliq    15 年前

    考虑一下你想要什么样的最终结果,并尝试用其他方法来实现它,这可能是有价值的。

    一种方法是:

    std::vector<MyClass> v;
    for (size_t i=0; i<nCount; i++)
        v.push_back(MyClass(static_cast<int>(i)));
    
        6
  •  -1
  •   Mister Mystère    15 年前

    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有着相同的想法,并且预期:静态成员本身不会在多线程程序中使用。