C++ 从派生类实例化的派生类访问基类成员变量

C++ 从派生类实例化的派生类访问基类成员变量,c++,C++,通过包含2个虚拟函数的接口从派生类访问基类成员变量时遇到问题。主要目的是我需要在两个不同的编程阶段使用这些类。 第一阶段是通过ArrayStemmedSnippet类用文本片段/句子填充数组 第二阶段,在程序的稍后阶段,是通过SuffixableElement接口类从基类中定义的句子数组/片段数组中获取项 我有一种强烈的感觉,我在这里错过了一些基本的东西。我认为这是一个基本的设计或逻辑错误。我也不得不承认,我不是一个C++专业,意味着我仍然是C++初学者,所以请容忍我…< /P> 让我向您展示我

通过包含2个虚拟函数的接口从派生类访问基类成员变量时遇到问题。主要目的是我需要在两个不同的编程阶段使用这些类。 第一阶段是通过ArrayStemmedSnippet类用文本片段/句子填充数组 第二阶段,在程序的稍后阶段,是通过SuffixableElement接口类从基类中定义的句子数组/片段数组中获取项

我有一种强烈的感觉,我在这里错过了一些基本的东西。我认为这是一个基本的设计或逻辑错误。我也不得不承认,我不是一个C++专业,意味着我仍然是C++初学者,所以请容忍我…< /P> 让我向您展示我的代码:

类别定义:


using namespace std;

// ---  class represents a stemmed term of a StemmedSentence object
class StemmedTerm {
private:
 string _word;
 string _stemmed;
public:
 StemmedTerm(string word, string stemmed);
 ~StemmedTerm();
 // --- Implementation of StemmedTerm interface
 string getTerm(); 
 string getStemmed(); 
};

class StemmedSentence;
class SuffixableElement;

// --- a snippet containing stemmed sentences
class ArrayStemmedSnippet {
friend class StemmedSentence;
public:
 ArrayStemmedSnippet();
 ArrayStemmedSnippet(Array snippetTerms);
 ~ArrayStemmedSnippet();
 SuffixableElement * getSentence(int n);
 int size() const; 
private:
 Array snippet;
 Array sentences;
};

// --- a stemmed sentence from ArrayStemmedSnippet
class StemmedSentence : public ArrayStemmedSnippet {
public:
 StemmedSentence(ArrayStemmedSnippet *p);
 StemmedSentence(const int start, const int end);
 virtual ~StemmedSentence(); 
 virtual void * get(int index) const; 
 virtual int size() const; 
private:
 int _start;
 int _end;
 ArrayStemmedSnippet *parent;
};

// --- interface to access a stemmed sentence and its size 
class SuffixableElement {
public:
 virtual ~SuffixableElement() = 0;
 virtual void * get(int index) const = 0;
 virtual int size() const = 0;
};
实施:


使用名称空间std

词干句子::词干句子(常量int开始,常量int结束) :_start(开始),_end(结束){ } 词干句子::词干句子(ArrayStemmedSnippet*p) :家长(p){ } 词干句子::~词干句子(){ } //---实现接口后缀元素 void*词干句子::get(int索引)常量{ 如果(索引==(大小()-1)){ 返回NULL;//---字符串(句子)结尾 } //从ArrayStemmedSnippet类中的snippets数组获取词干术语 //为null,因为数组不能通过后缀iFace/eg进行访问,未定义 返回代码段[_start+index]; } //---实现接口后缀元素 int-stemed句子::size()常量{ 返回_end-_start+2; }

//---在句子中添加片段术语数组。NULL表示句子的结尾 ArrayStemmedSnippet::ArrayStemmedSnippet(){} ArrayStemmedSnippet::ArrayStemmedSnippet(数组snippetTerms) :snippet(snippetTerms){ int指数=0; for(int i=0;i

主体:


int main() {
    // Sentence 1:
    Array stemmed;
    StemmedTerm *st1 = new StemmedTerm( "Mouse", "Mouse" );
    StemmedTerm *st2 = new StemmedTerm( "ate", "ate" );
    StemmedTerm *st3 = new StemmedTerm( "cheese", "cheese" );

    stemmed.append( st1 );
    stemmed.append( st2 );
    stemmed.append( st3 );
    stemmed.append( NULL ); // ---- end of snippet sentence

    // Sentence 2: 
    StemmedTerm *st21 = new StemmedTerm( "Cat", "Cat" );
    StemmedTerm *st22 = new StemmedTerm( "ate", "ate" );
    StemmedTerm *st23 = new StemmedTerm( "cheese", "cheese" );
    StemmedTerm *st24 = new StemmedTerm( "too", "too" );

    stemmed.append( st21 );
    stemmed.append( st22 );
    stemmed.append( st23 );
    stemmed.append( st24 );
    stemmed.append( NULL ); // ---- end of snippet sentence
    //  ok -- one stemmedsnippet with 2 sentences
    ArrayStemmedSnippet ass( stemmed );

    // do some sother stuff ... later in the program ....

    // --- get elements and size info thru SuffixableElements interface 
    SuffixableElement *currentElement = (SuffixableElement *)ass.getSentence(1);
    cout << "cur. element size=" << currentElement->size() << endl;
    StemmedTerm *st = (StemmedTerm*)currentElement->get(2, ass);
    string str = st->toString();
    cout < "second word is=" << str << endl;

    delete st1;
    delete st2;
    delete st3;

    delete st21;
    delete st22;
    delete st23;
    delete st24;

return 1;
} 

int main(){
//第1句:
阵列茎;
stemedTerm*st1=新的stemedTerm(“鼠标”、“鼠标”);
stemedTerm*st2=新的stemedTerm(“ate”,“ate”);
stemedTerm*st3=新的stemedTerm(“奶酪”、“奶酪”);
词干附加(st1);
词干附加(st2);
词干附加(st3);
带词干的.append(NULL);//----片段句子的结尾
//第2句:
词干术语*st21=新词干术语(“Cat”、“Cat”);
stemedTerm*st22=新的stemedTerm(“ate”、“ate”);
stemedTerm*st23=新的stemedTerm(“奶酪”、“奶酪”);
stemedTerm*st24=新的stemedTerm(“太”、“太”);
词干附加(st21);
词干附加(st22);
词干附加(st23);
词干附加(st24);
带词干的.append(NULL);//----片段句子的结尾
//好的——一段有两个句子的词干片段
ArrayStemmedSnippet ass(带词干);
//做一些其他的事情…在节目的后面。。。。
//---通过SuffixableElements接口获取元素和大小信息
SuffixableElement*currentElement=(SuffixableElement*)ass.getSession(1);
cout-toString();

cout<“第二个单词是=“如果
后缀元素
是您的接口,那么
词干句子
必须从它派生出来

// --- returns n-th sentence of this snippet
SuffixableElement* ArrayStemmedSnippet::getSentence(int n) {
    // ...
    return (SuffixableElement*)sentences[ n ];
}
“句子”是词干句子类的对象数组。词干句子不是从SuffixableElement派生的,也就是说它不提供该接口

请尝试以下操作:

class StemmedSentence : public ArrayStemmedSnippet, public SuffixableElement {
    // ...
};


老实说,现在还不太清楚您想要实现什么。代码根本无法编译。请您更详细地(用简单的英语)说明这个概念是什么?我希望能够访问数组“片段”通过SuffixableElement接口在基类ArrayStemmedSnippet中定义。但是当我使用SuffixableElement currentElement=(SuffixableElement)ass.getSession(1)的接口时;从句子数组中获取第二个句子,并尝试使用currentElement->get(2)获取第三个词干项(第三个单词)from失败,因为基类中的数组为null。虽然很清楚,但我试图找到一种通过该接口访问的方法。我需要该接口访问数组,以处理snippet数组中的单个项。在我尝试打印get()中的snippet[]数组项之前函数,数组为空,因为我是从接口端实例化的。它在SuffixableElement接口中不可见。所有输入的数据都由ArrayStemmedSnippet ass(带词干)完成;不可见。我想我在这里有一些基本的误解,我只是不明白…向下滚动我的主帖子(类定义)的第一个代码窗口,它作为最后一个条目在那里…好吧,哪些类实现了这个接口?那就是StemedSession类,请参阅“virtual void*get(int index)”和“”.get返回StemedSession对象之外的单个StemedTerm对象,size返回StemedSession对象的大小。我现在试试你的建议……我只是想知道setParent()是否与调用StemedSession(此)构造函数不同?这似乎不起作用,所以setParent(此)不起作用通过设置StemedSession*父变量。您是如何在StemedSession类中实现setParent()的?
// --- returns n-th sentence of this snippet
SuffixableElement* ArrayStemmedSnippet::getSentence(int n) {
    // ...
    return (SuffixableElement*)sentences[ n ];
}
class StemmedSentence : public ArrayStemmedSnippet, public SuffixableElement {
    // ...
};
SuffixableElement* ArrayStemmedSnippet::getSentence(int n) {
    StemmedSentence* sentence = sentences[ n ];
    sentence->setParent(this);
    return sentence;
}