初始化我自己的类类型的向量

时间:2013-02-15 17:49:32

标签: c++ vector c++11

我正在尝试声明我自己的类类型的静态向量( SY :: Symbol ),如下所示:

SymbolsTable.h

namespace SYT
{
    class SymbolsTable
    {
        public:
            static std::vector<SY::Symbol> m_symbols;
                    void addToken(TK::Token);
    };
}

我希望在我的 SymbolsTable.cpp 文件中的方法addToken中使用它。

SymbolsTable.cpp

#include "../../includes/px/SymbolsTable.h"
#include "../../includes/px/Token.h"

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols(std::initializer_list<SY::Symbol>);

SYT::SymbolsTable::SymbolsTable()
{

}

void SYT::SymbolsTable::addToken(TK::Token token)
{
    int index = getSymbolIndex(token); 

    if(index == -1)
    {
        SY::Symbol symb(token, "");
        SYT::SymbolsTable::m_symbols.push_back(symb);
        token.setIndex(indexOf(m_symbols, symb)); 
    }
    else
    {
        token.setIndex(index);
    }       
}

我已经尝试在我的 SymbolsTable.cpp 中的类外声明并初始化它,但是我知道错误。

  

错误:没有'std :: vector   SYT :: SymbolsTable :: m_symbols(的std :: initializer_list)”   在'SYT :: SymbolsTable''

类中声明的成员函数

正如你所看到的,我必须初始化它,所以我试图使用这个initializer_list,我不知道我是否正确。

所以,我知道我必须在所有事情之前初始化矢量。

我的问题是:

  • 在哪里初始化它;
  • 如何将其初始化。

2 个答案:

答案 0 :(得分:2)

std::initializer_list<SY::Symbol>

这是一个类型,因此编译器将此作为函数定义读取,该函数定义尚未在指定的作用域中声明,因此是错误。

你可以写

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols;

只需定义它,或

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols{1,2,3,4};

初始化它 - 注意用有效的SY::Symbol对象替换1-4。

答案 1 :(得分:1)

你可以写

std::vector<SY::Symbol> SYT::SymbolsTable::m_symbols;

在cpp文件中。

这使用默认构造函数,将向量初始化为空向量。

但是,很可能您并不真正需要静态成员,因为让非静态成员函数更新静态数据成员会感觉非常错误。相反,你可能想要一个类的静态实例。甚至那可能是次优设计,但仍然可能是一种改进。