对象指针参数不能使用与对象相同的类的访问器方法

时间:2012-02-02 16:58:58

标签: c++ syntax-error

所以我有这个:

class A
{
private:
    unsigned int _uid; //user identifier
public:
    A();
    A(const char *, const char *, int, int, const char *, const char *, const char *);
    virtual ~A();
    int getUserID();
};

int A::getUserID(){
    return _uid;
}

//The class UserDB is not that important as this method is at this moment.
void UserDB::adduser(A* newUser){
    if(newUser.getUserID == 0) //Not working, not sure why... Gives syntax error. (1)
    //Something is done if the condition is true;
};

int main(){
    UserDB B
    A tempObj;
    //Assume the 7 following variables have been initialized correctly.
    char uloginName[9];
    char homeDirectory[33];
    int userID;
    int groupID;
    char password[17];
    char shell[17];
    char gecos[65];
    tempObj = new A(uloginName, password, userID, groupID, gecos, homeDirectory, shell);
    B = new UserDB();
    B.addUser(tempObj);
}

所以我不知道我不能让参数指针使用访问器方法(参见标记为(1)的行)。有人可以给我一个快速解决方案吗?我搜索了一种方法来执行此操作,但似乎没有人使用参数指向对象的访问器。

4 个答案:

答案 0 :(得分:2)

你在这里遇到了很多问题。让我试着为你解决其中一些问题。

你声明:

     unsigned int _uid; //user identifier

但你对此的满意是:

    int getUserID();

这可能会导致截断。它应该是:

    unsigned int getUserID() const;

const因为您没有修改class的实例。

这将被定义:

unsigned int A::getUserID() const
{
    return _uid;
}

接下来,幻像class的这种方法:

void UserDB::adduser(A* newUser)

你说:

  

我搜索了一种方法来执行此操作,但似乎没有人使用参数指向对象的访问器。

那是因为在这样的class中没有必要这样做。你应该更喜欢在这里通过引用。 const - 参考会更好,但不要改变太多......

void UserDB::adduser(A& newUser)
{
    if (newUser.getUserID() == 0)
    {
        //Something is done if the condition is true;
    }
};

那里没有语法错误!对于指针,首先您需要检查它不是NULL,然后使用->运算符而不是.。参考文献更清晰。

然后,到......

int main(){

    A tempObj;

这在堆栈上构造A的实例,调用默认构造函数。你不需要这个,所以只需删除它。

    UserDB B;

这在堆栈上构造B,再次调用默认构造函数。我打算不管它。

    //Assume the 7 following variables have been initialized correctly.

好。就这一次。

    tempObj = new A(uloginName, password, userID, groupID, gecos, homeDirectory, shell);

你做不到! tempObjA,而非A*。而只是在堆栈上创建一个A来调用第二个构造函数:

    A tempObj(uloginName, password, userID, groupID, gecos, homeDirectory, shell);

现在进入......

    B = new UserDB();

同样,你不能这样做。 BUserDB,而非UserDB*。只需删除此行,就不需要它,因为您已经在堆栈中创建了一行!

这条线几乎是正确的......

    B.addUser(tempObj);

...但C ++区分大小写!使用:

    B.adduser(tempObj);

你的代码应该编译。

read a book or two的时间!

答案 1 :(得分:1)

我想tempObj应该是指针:A tempObj = new A();,所以看起来应该是这样的:

int main()
{
    // ...
    A* tempObj = new A(uloginName, password, userID, groupID, gecos, homeDirectory, shell);
    UserDB B;
    B.addUser(tempObj);
    // ...
    delete tempObj;
    return 0;
}

if(newUser.getUserID == 0)应该是if(newUser->getUserID() == 0)因为你正在处理指针而getUserID是一个方法,而不是一个成员变量。

希望这有帮助。

答案 2 :(得分:1)

if(newUser.getUserID == 0)更改为if(newUser->getUserID() == 0)
B.addUser(tempObj);B->addUser(&tempObj);

您还需要将tempObjB个对象声明为指针:

UserDB* B
A* tempObj;

当然,如果您不需要,则不建议使用指针,因为您必须处理内存管理问题。这是没有指针的方法:

void UserDB::addUser(A newUser)
{
    if(newUser.getUserID() == 0)
    {
        //Something is done if the condition is true;
    } 
};

int main(){    
    //Assume the 7 following variables have been initialized correctly.
    char uloginName[9];
    char homeDirectory[33];
    int userID;
    int groupID;
    char password[17];
    char shell[17];
    char gecos[65];
    UserDB B;
    A tempObj(uloginName, password, userID, groupID, gecos, homeDirectory, shell);
    B.addUser(tempObj);
}

为了提高性能,最好传递newUser参数by reference,以便在传递给addUser方法时不会复制它。并使其const以确保其值不会在addUser方法中意外修改:

void UserDB::addUser(const A &newUser)
{
    if(newUser.getUserID() == 0)
    {
        //Something is done if the condition is true;
    } 
};

答案 3 :(得分:0)

newUser是指针,因此您需要(*newUser).newUser->才能访问指向的内容。

要调用函数,您需要使用函数调用运算符()

然后你得到

newUser->getUserID()