【问题标题】:Why I cant access this private variable?为什么我不能访问这个私有变量?
【发布时间】:2015-06-16 02:16:04
【问题描述】:

我正在尝试使用 OOP 制作 BST,我的讲师希望我将节点放入课堂,所以我制作了这段代码

节点.h

#ifndef node_h
#define node_h
#include <string>

using namespace std;

class Node{
    public : 
        Node();
        Node(Node* left_node, Node* right_node, string newname, string newaddress, int age);
        ~Node();
        // Getter
        Node* GetLeft();
        Node* GetRight();
        string GetName();
        string GetAddress();
        int GetAge();
        // Setter
        void SetName(string newname);
        void SetAddress(string newaddress);
        void SetAge(int newage);
        void SetLeft(Node* newnode);
        void SetRight(Node* newnode);
    private :
        string name,address;
        int age;
        Node* left;
        Node* right;
};

#endif

node.cpp

#include "node.h"

using namespace std;

Node::Node(){
    Node::name="";
    Node::address="";
    Node::age=0;
    Node::left=NULL;
    Node::right=NULL;
};

Node::Node(Node* left_node, Node* right_node, string newname, string newaddress, int newage){
    Node::left = left_node;
    Node::right = right_node;
    Node::name = newname;
    Node::address = newaddress;
    Node::age = newage;
};

Node::~Node(){

}

// Getter
Node* Node::GetLeft(){
    return left;
};

Node* Node::GetRight(){
    return right;
};

string Node::GetName(){
    return name;
};

string Node::GetAddress(){
    return address;
};

int Node::GetAge(){
    return age;
};

// Setter
void Node::SetName(string newname){
    Node::name = newname;
};

void Node::SetAddress(string newaddress){
    Node::address = newaddress;
};

void Node::SetAge(int newage){
    Node::age = newage;
};

void SetLeft(Node* newnode){
    Node::left = newnode;
};

void SetRight(Node* newnode){
    Node::right = newnode;
};

但是当我运行它时,我对非静态数据成员的使用无效

任何人都可以帮助我应该怎么做才能设置左节点和右节点? NB : 我对 OOP 不太好,刚开始学习,英语不好也很抱歉

【问题讨论】:

  • 在你的函数体内:Node::name -> name etc. etc. etc.
  • 已编辑,感谢指点
  • 而不是“当我运行它时,我对非静态数据成员的使用无效”说:当我编译时,我得到:[在此处复制粘贴您的错误消息]
  • @MattMcNabb 谢谢,我会记住的

标签: c++ oop binary-search-tree private treenode


【解决方案1】:

问题出在:

void SetLeft(Node* newnode){
    Node::left = newnode;
};

SetLeft 不是Node 的成员,因此它无法访问Node 的私有成员。

你的意思可能是:

void Node::SetLeft(Node* newnode){

等等。下面的SetRight也有同样的问题。

【讨论】:

  • 是的,这就是我要找的,我的愚蠢错误,谢谢你帮助我
  • 我已经像你所说的那样更改了我的代码,但是当我编译它时,我得到:[c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../. ./../libmingw32.a(main.o):(.text.startup+0xa7): 未定义引用WinMain@16collect2.exe: 错误: Id 返回 1 退出状态]
  • @Alv 你需要一个main 函数
【解决方案2】:

node.cpp 中使用范围解析运算符写入SetLeft。应该写成:void Node::SetLeft(parameters)SetRight也应该写成同样的方式。

【讨论】:

    【解决方案3】:

    代替:

    Node::left = newnode;
    

    使用:

    this->left = newnode;
    

    通过使用 Node::left,您试图访问一个未声明的静态成员。

    “this”反映了您正在使用的类实例!

    【讨论】:

    • 我得到“在非成员函数中无效使用 'this'”
    • Node的成员函数中,使用Node::left引用私有成员变量left是有效的
    • 啊,那我错了!对 C# 有点困惑。谢谢指正。
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2013-05-28
    • 2020-12-28
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    相关资源
    最近更新 更多