3

我有以下课程:

class clsUnitArrayIndexToUnitID : public CBaseStructure
{
    private:
        std::vector<int> m_content;
        long m_size;
    protected:
        void ProcessTxtLine(string line);
    public:
        clsUnitArrayIndexToUnitID();
        std::vector<int>* Content;
        long Size();
};

我想从类外部访问值,例如:

int iUnitID = m_MyClass.Content()[12];

但是,C++ 告诉我需要使用指向函数类型。我不确定这到底是什么意思。

另外,如果有人发现我的代码有任何缺陷,请告诉我。

4

6 回答 6

7

将其更改为功能(const根据您的需要调整)

 public:
     const std::vector<int>& Content() const { return m_content; } 

并按照您的描述使用,或以任何一种方式取消引用指针(不安全?):

m_MyClass.Content->at(12); 
(*m_MyClass.Content).at(12);
(*m_MyClass.Content)[12];
于 2013-04-18T07:01:50.740 回答
4

您可以为类提供索引访问运算符,而不是暴露向量:

class clsUnitArrayIndexToUnitID : public CBaseStructure
{
 public:
  int& operator[](unsigned int i) {return m_content[i];}
  const int& operator[](unsigned int i) const {return m_content[i];}
....
};

然后

int iUnitID = m_MyClass[12];
于 2013-04-18T07:02:04.990 回答
2

要回答您的具体问题,您应该这样做:

(*m_MyClass.Content)[12]

或这个:

m_MyClass.Content->at(12); //note that the semantics is slightly different - at() checks boundaries, [] does not

但是,您真正应该做的事情可能是重新考虑您的设计。为什么你的类有一个指向容器的指针类型的公共数据成员?如果这总是指向m_content,您不妨m_content公开并省去麻烦。

私有数据成员背后的一般想法是提供基于语义的访问,以便您的函数可以按照其语义要求发布诸如“插入向量”、“从向量中获取元素”等函数。或者,例如,您可以提供一个只读访问器函数返回const std::vector<int>&,并将修改访问权留给特殊的成员函数。

如果你提供一个包装器来提供直接的非常量访问,那么它几乎不是一个包装器(它总是必须由某些东西直接支持)。

当然,上面的讨论适用于 ifContent实际上是一个指向的指针,m_content而不仅仅是指向不同向量的指针。但在这种情况下,我认为课程会更加混乱。

于 2013-04-18T07:09:16.850 回答
1

更改定义如下:

 const std::vector<int>* Content() const {
      return &m_content;
 }

第一个 const 关键字并不是真正需要的,但第二个表示该方法不应该也不应该修改实例。

于 2013-04-18T07:01:34.083 回答
0

您可以返回引用而不是指针:

std::vector<int> m_content(UNITS_MAX_SIZE);

const std::vector<int> &clsUnitsUnitIDToArrayIndex::Content() const
{
    return m_content;
}
于 2013-04-18T07:09:19.443 回答
0

按照 juanchopanza 的建议,提供一个包装方法来检索内容或重载 operator[]。

class clsUnitArrayIndexToUnitID : public CBaseStructure
{
    private:
        std::vector<int> m_content;
        long m_size;
    protected:
        void ProcessTxtLine(string line);
    public:
        clsUnitArrayIndexToUnitID();
        //std::vector<int>* Content;

        int GetContent(int index) { 
        int retValue = INVALID_CONTENT
        if(index >=0 && index<m_content.size())
          retValue = m_content[index];
        return retValue;
       }        

       long Size();
};

并将其用作

int iUnitID = m_MyClass.GetContent(12);
于 2013-04-18T07:06:25.680 回答