首页 文章

C多态性/类依赖性错误[关闭]

提问于
浏览
-4

我正在使用C来创建一个具有多态性的基本族 . 但是,我在编译时遇到错误,并且我不确定如何纠正它们(我说 class dependency ,因为父和子在创建另一个之前彼此依赖):

错误C2061:语法错误:标识符'父'错误C2143:语法错误:缺少';'在'*'之前错误C4430:缺少类型说明符 - 假定为int . 注意:C不支持default-int错误C2065:'parent':未声明标识符错误C2065:'name':未声明标识符错误C2614:'Child':非法成员初始化:'par'不是基数或成员错误C2065: 'par':未声明的标识符错误C2227:' - > addChild'的左边必须指向class / struct / union / generic类型错误C2065:'par':未声明的标识符错误C2227:' - > Name'的左边必须指向class / struct / union /泛型类型错误C2661:'Child :: Child':没有重载函数需要2个参数错误C2065:'par':未声明标识符错误C2227:' - > Name'左边必须指向class / struct / union /泛型

/* Polymorphism Family */
#include <iostream>
#include <vector>
class Child{
public:
    Child(Parent* parent, char* name) : par(parent), Name(name){ par->addChild(this); };
    Parent* par;
    char* Name;
    virtual void Speak(void){
        std::cout << "I am a child, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
    }
};
class Parent{
public:
    Parent(char* name) : Name(name){};
    char* Name;
    std::vector<Child*> Children;
    virtual void Speak(void){
        std::cout << "I am a parent called " << Name << std::endl;
        if(Children.size() == 0){
            std::cout << "I have no children" << std::endl;
        }
        else{
            std::cout << "I have " << Children.size() << " children:" << std::endl;
            for(auto c : Children){
                std::cout << c->Name;
            }
        }
    }
    void addChild(Child* child){
        Children.push_back(child);
    }
};
class Father : public Parent{
public:
    Father(char* name) : Parent(name){}
    void Speak(void){
        std::cout << "I am a father called " << Name << std::endl;
        if(Children.size() == 0){
            std::cout << "I have no children" << std::endl;
        }
        else{
            std::cout << "I have " << Children.size() << " children:" << std::endl;
            for(Child* c : Children){
                std::cout << c->Name;
            }
        }
    }
};
class Son : public Child{
public:
    Son(Parent* parent, char* name) : Child(parent, name){}
    void Speak(void){
        std::cout << "I am a son, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
    }
};
int main(void){
    Father* Dad = new Father("James");
    Dad->Speak();
    Son* John = new Son(Dad, "John");
    John->Speak();
    Dad->Speak();
    delete[] Dad, John;
    getchar();
    return (0);
}

Edit: I have 2 errors now:

/* Polymorphism Family */
#include <iostream>
#include <vector>

class Parent;

class Child{
public:
    Child(Parent* parent, char* name);
    Parent* par;
    char* Name;
    virtual void Speak(void){
        std::cout << "I am a child, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
    }
};

class Parent{
public:
    Parent(char* name) : Name(name){};
    char* Name;
    std::vector<Child*> Children;
    virtual void Speak(void){
        std::cout << "I am a parent called " << Name << std::endl;
        if(Children.size() == 0){
            std::cout << "I have no children" << std::endl;
        }
        else{
            std::cout << "I have " << Children.size() << " child(ren):" << std::endl;
            for(auto c : Children){
                std::cout << c->Name << std::endl;
            }
        }
    }
    void addChild(Child* child){
        Children.push_back(child);
    }
};

Child::Child(Parent* parent, char* name){
    Child::par = parent;
    Child::Name = name;
    par->addChild(this); 
};

class Father : public Parent{
public:
    Father(char* name) : Parent(name){}
    void Speak(void){
        std::cout << "I am a father called " << Name << std::endl;
        if(Children.size() == 0){
            std::cout << "I have no children" << std::endl;
        }
        else{
            std::cout << "I have " << Children.size() << "child(ren):" << std::endl;
            for(auto c : Children){
                std::cout << c->Name << std::endl;
            }
        }
    }
};
class Son : public Child{
public:
    Son(Parent* parent, char* name) : Child(parent, name){}
    void Speak(void){
        std::cout << "I am a son, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
    }
};
int main(void){
    Father* Dad = new Father("James");
    Dad->Speak();
    Son* John = new Son(Dad, "John");
    John->Speak();
    Dad->Speak();
    delete[] Dad, John;
    getchar();
    return (0);
}

1 回答

  • 2

    您的 Child 类使用尚未定义的 Parent 类(不在代码上方,在 Child 之前或在某些包含的文件中) . 要解决此问题,请在(或"above") Child 之前声明 Parent 类 . 例如:

    class Parent;
    
    //child class declaration as posted in your code and other classes include Parent.
    class Child{
    public:
        Child(Parent* parent, char* name) : par(parent), Name(name){ par->addChild(this); };
        Parent* par;
    ...
    

    希望这可以帮助 .

    [已添加]以下是作者提问的代码示例:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Child;
    
    class Parent {
    
    public:
        Parent(const char* name) : Name(name){};
        const char* Name;
        std::vector<Child*> Children;
    
        void Speak(void);
        void addChild(Child* child);
    };
    
    class Child{
    public:
        Child(Parent* parent, const char* name) {
            Child::par = parent;
            Child::Name = name;
            par->addChild(this); 
        }
    
        Parent* par;
        const char* Name;
        virtual void Speak(void){
            std::cout << "I am a child, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
        }
    };
    
    void Parent::Speak(void){
            std::cout << "I am a parent called " << Name << std::endl;
            if(Children.size() == 0){
                std::cout << "I have no children" << std::endl;
            }
            else{
                std::cout << "I have " << Children.size() << " child(ren):" << std::endl;
                for(auto c : Children){
                    std::cout << c->Name << std::endl;
                }
            }
        }
    
    
    void Parent::addChild(Child* child) {
            Children.push_back(child);
        }
    
    class Father : public Parent{
    public:
        Father(const char* name) : Parent(name){}
        void Speak(void){
            std::cout << "I am a father called " << Name << std::endl;
            if(Children.size() == 0){
                std::cout << "I have no children" << std::endl;
            }
            else{
                std::cout << "I have " << Children.size() << "child(ren):" << std::endl;
                for(auto c : Children){
                    std::cout << c->Name << std::endl;
                }
            }
        }
    };
    
    class Son : public Child{
    public:
        Son(Parent* parent, const char* name) : Child(parent, name){}
        void Speak(void){
            std::cout << "I am a son, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
        }
    };
    
    int main(int argc, char** argv){
    
        //i suggest you to use stack-located variables against heap-located
        Father Dad("James");
        Dad.Speak();
    
        Son John(&Dad, "John");
        John.Speak();
        Dad.Speak();    
    
        // Father* Dad = new Father("James");
        // Dad->Speak();
        // Son* John = new Son(Dad, "John");
        // John->Speak();
        // Dad->Speak();
        // delete Dad; 
        // delete John;
        //getchar();
        return (0);
    }
    

    输出online cpp editor

    Compiling the source code....
    $g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1
    
    Executing the program....
    $demo 
    I am a father called James
    I have no children
    I am a son, my name is John and my parent's name is James
    I am a father called James
    I have 1child(ren):
    John
    

相关问题