繁体   English   中英

为什么编译器不喜欢与“Iter”关联的所有字符串?

[英]Why doesn't the compiler like all the strings that are associated with "Iter"?

我正在实现一种行为设计模式。

编译器在与“Iter”相关的行中给出错误。 我完全不明白为什么会发生这种情况,更何况,如何解决?

我认为可能某处存在笔误(我正在按照书中的示例进行程序,代码是屏幕截图,需要重新输入)-但没有笔误,一切都与那里一样。

那么可能是什么问题呢?

我怀疑由于我的知识水平低,这对我来说不是很简单。

错误:

main.cpp:57:2: error: ‘Iter’ does not name a type
  Iter* createIterator() const;
  ^~~~
main.cpp:98:41: error: no ‘Iter* ContainerPerson::CreateIterator() const’ member function declared in class ‘ContainerPerson’
 Iter* ContainerPerson::CreateIterator() const {
                                         ^~~~~
main.cpp: In function ‘int main()’:
main.cpp:113:18: error: ‘class ContainerPerson’ has no member named ‘createIterator’
  Iter* it = list.createIterator();
                  ^~~~~~~~~~~~~~
main.cpp:118:10: error: invalid use of non-static member function ‘void Iter::first()’
  for(it->first; !it->isDoneBegin(); it->next()) {
      ~~~~^~~~~
main.cpp:69:7: note: declared here
  void first() {
       ^~~~~
main.cpp:124:10: error: invalid use of non-static member function ‘void Iter::first()’
  for(it->first; !it->isDoneBegin(); it->prev()) {
      ~~~~^~~~~
main.cpp:69:7: note: declared here
  void first() {
       ^~~~~

完整代码:

#include <iostream>
#include <string>
using namespace std;

class Person {
public: 
    string name;
    int age;
    string address;

    Person() {
        name = "";
        age = 0;
        address = "";
    }
    
    Person(string n, int a, string ad) {
        name = n;
        age = a;
        address = ad;
    }

    void prn() {
        cout << "Информация о человеке:";
        cout << "\n Фамилия: " << name;
        cout << "\t Возраст: " << age;
        cout << "\n Город: " << address;
    }
};

class ContainerPerson {
public:
    Person* masPerson;
    int currentpos;

    ContainerPerson(int size) {
        masPerson = new Person[size];
        currentpos = - 1;
    }

    ~ContainerPerson() {
        delete []masPerson;
    }

    void add(Person *obj) {
        int pos = ++currentpos;
        masPerson[pos].name = obj->name;
        masPerson[pos].age = obj->age;
        masPerson[pos].address = obj->address;
    }

    bool isEmpty() {
        return (currentpos == - 1);
    }

    friend class Iter;
    Iter* createIterator() const;
};

class Iter {
    const ContainerPerson* container;
    int index;

public:
    Iter(const ContainerPerson* con) {
        container = con;
    }
    
    void first() {
        index = 0;
    }

    void end() {
        index = container->currentpos;
    }

    void next() {
        index++;
    }

    void prev() {
        index--;
    }

    bool isDoneEnd() {
        return (index == container->currentpos + 1);
    }

    bool isDoneBegin() {
        return (index == -1);
    }

    Person currentItem() {
        return container->masPerson[index];
    }
};

Iter* ContainerPerson::CreateIterator() const {
    return new Iter(this);
}

int main() {
    setlocale(LC_ALL, "Russian");
    ContainerPerson list(7);
    list.add(new Person("Sur1", 26, "City1"));  
    list.add(new Person("Sur2", 33, "City2"));
    list.add(new Person("Sur3", 65, "City3"));
    list.add(new Person("Sur4", 43, "City4"));
    list.add(new Person("Sur5", 58, "City5"));
    list.add(new Person("Sur6", 47, "City6"));
    list.add(new Person("Sur7", 32, "City7"));
    
    Iter* it = list.createIterator();
    Person currentPerson;   
    

    cout << "\nOutput (beg-next):";
    for(it->first; !it->isDoneBegin(); it->next()) {
        currentPerson = it->currentItem();
        currentPerson.prn();
    }

    cout << "\nOutput (beg-prev):";
    for(it->first; !it->isDoneBegin(); it->prev()) {
        currentPerson = it->currentItem();
        currentPerson.prn();
    }

    return 0;
}
  1. 您需要前向声明class Iter; class ContainerPerson的声明之外。 否则,朋友 class 是ContainerPerson::Iter ,它与您稍后声明的Iter无关。 请参阅为什么 C++ 朋友 class 仅在其他命名空间中需要前向声明?

  2. Iter* ContainerPerson::CreateIterator()定义中的错字:应该是createIterator ,小写c

  3. for(it->first; ...)中的错字; 应该是it->first()

  4. 您的迭代混淆了。 他们应该是

    for(it->first(); !it->isDoneEnd(); it->next()) {
        // ...
    }
    for(it->end(); !it->isDoneBegin(); it->prev()) {
        // ...
    }

通过这些修复,它可以干净地编译和运行: https://godbolt.org/z/3K7T7d14h

稍后修复的奖励错误:您永远不会deleteContainerPerson::createIterator()中分配的Iter 那是 memory 泄漏。

main.cpp:57:2: error: ‘Iter’ does not name a type
  Iter* createIterator() const;
  ^~~~

虽然这个朋友的声明 class

friend class Iter;

出现在 class ContainerPerson的定义中,但名称Iter在 class ContainerPerson的 scope 中不可见。

所以编译器会为这个成员 function 声明发出错误。

您需要在 class ContainerPerson之前声明 class Iter 例如

class Iter;

class ContainerPerson
{
    //...
    friend class Iter;
    Iter* createIterator() const;
    //...
};

或者在 function 声明中的返回类型中使用详细的类型说明符,例如

class ContainerPerson
{
    //...
    friend class Iter;
    class Iter* createIterator() const;
    //...
};


main.cpp:98:41: error: no ‘Iter* ContainerPerson::CreateIterator() const’ member function declared in class ‘ContainerPerson’
 Iter* ContainerPerson::CreateIterator() const {
                                         ^~~~~

您声明了成员 function

Iter* createIterator() const;
      ^^

不是成员 function

Iter* CreateIterator() const;
      ^^


main.cpp: In function ‘int main()’:
main.cpp:113:18: error: ‘class ContainerPerson’ has no member named ‘createIterator’
  Iter* it = list.createIterator();
                  ^~~~~~~~~~~~~~

此错误是第一个错误的结果。

至于这些错误

main.cpp:118:10: error: invalid use of non-static member function ‘void Iter::first()’
  for(it->first; !it->isDoneBegin(); it->next()) {
      ~~~~^~~~~

main.cpp:124:10: error: invalid use of non-static member function ‘void Iter::first()’
  for(it->first; !it->isDoneBegin(); it->prev()) {
      ~~~~^~~~~

那么看来您的意思是 function 调用

it->first()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM