【问题标题】:Initialize array or vector in constructor在构造函数中初始化数组或向量
【发布时间】:2012-10-02 15:23:51
【问题描述】:

假设包含正确的标题。

我有一个关于计算器各种功能的课程。我有几个用于不同运算符类型(nullary、Unirary、Binary、Ternary)的结构。我想初始化结构的一个向量(或者最好是一个数组),其中填充了我的计算器支持的元素。例如nul[]={{pi, "pi"}, {ans, "ans"}}; 然后我的程序将从输入中获取一个标记并搜索适当的运算符,返回该运算符的索引,然后我将调用适当的函数指针。我的问题是在构造函数中初始化数组或向量。如果有人可以向我展示两种方式,我将不胜感激。谢谢。下面是我的班级和未完成的构造函数。另外,如果你能想到一个更好的方法让我写我的计算器,我很乐意听到。

//operator class
class Functions{
    public:
        Functions();
        double pi(double x=0);
        double answer(double& x);
        double abs(double& x);
        double pow(double& x);
        double add(double& x, double &y) const;
        double subtract(double& x, double& y) const;
        double multiply(double& x, double& y)const;
        double divide(double& x, double& y) const;
        double max(double& x, double& y, double& z) const;
        double volume(double& x, double& y, double& z) const;
        void doc();
        bool weird(double &x) const;
        unsigned findop0(const string & name);
        unsigned findop1(const string & name);
        unsigned findop2(const string & name);
        unsigned findop3(const string & name);
    private:
        struct Nul{
            double (*nulf)(double & x);
            string name;
        };
        struct Uni{
            bool (*unif)( double & result, double x );
            string name;
        };
        struct Bin{
            bool (*binf)( double & result, double x, double y );
            string name;
        };
        struct Tern{
            bool (*terf)( double & result, double x, double y, double z );
            string name;
        };
        static const unsigned NUL_ELEMENTS = 2;
        static const unsigned UNI_ELEMENTS = 2;
        static const unsigned BIN_ELEMENTS = 4;
        static const unsigned TRI_ELEMENTS = 2;
        vector<Nul> nul;
        vector<Uni> uni;
        vector<Bin> bin;
        vector<Tern> tri;
};

Functions::Functions(){
    nul
}

【问题讨论】:

  • 在 C++ 中使用初始化列表很简单...否则只需在构造函数中使用 push_back
  • vector 使用 C++11 很容易。这比以前更难。

标签: c++ arrays class vector constructor


【解决方案1】:

在 C++11 中,您可以在初始化列表中的一行中执行此操作。

struct C {
  int a[20];
  int* b;
  std::vector<int> c;
  std::array<int,20> d;
  C() : 
     a({1,2,3}), 
     b(new int[20]{1,2,3}), 
     c({1,2,3}), 
     d(std::array<int, 20u>{1,2,3}) 
  {}
};

在 C++03 中使用多行赋值或制作静态函数来初始化向量或原始数组。

struct C {
  int a[20];
  int* b;
  std::vector<int> c;
  C() : 
     b(new int[20]), 
  {
     a[0] = 1; ...
     b[0] = 1;
     c.push_back(1);
  }
};

【讨论】:

  • 我不想打扰,但它似乎仍然无法正常工作。 Functions::Functions() : nul({{pi,"pi"},{&amp;answer,"ans"}}),uni({{&amp;abs,"abs"},{&amp;pow,"pow"}}), bin({{&amp;add,"+"},{&amp;subtract,"-"},{&amp;multiply,"*"},{&amp;divide,"/"}}), tri({{&amp;max, "max"},{&amp;vol,"vol"}}) {}我不断收到的错误告诉我Error 4 error C2143: syntax error : missing ';' before '}'
  • 哪个编译器?是否支持 std::vector 的大括号初始化?
  • 另一个问题 - 你的函数必须是静态的才能匹配你的结构函数类型。
  • 我正在使用我学校提供的 Visual Studio 2012。我猜这只是微软的一个令人讨厌的怪癖,对吧?
  • 不,2012 肯定支持这个,也许你需要在 C++11 上切换?你还有很多其他错误。请参阅ideone.com/42oqY - 它有效。您的一些问题 - 方法必须是静态的而不是 const,您的 pi 和答案不匹配。我修复了 nul 向量 - 休息一下自己试试...
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多