所以我有这个:
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)的行)。有人可以给我一个快速解决方案吗?我搜索了一种方法来执行此操作,但似乎没有人使用参数指向对象的访问器。
答案 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);
你做不到! tempObj
是A
,而非A*
。而只是在堆栈上创建一个A
来调用第二个构造函数:
A tempObj(uloginName, password, userID, groupID, gecos, homeDirectory, shell);
现在进入......
B = new UserDB();
同样,你不能这样做。 B
是UserDB
,而非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);
您还需要将tempObj
和B
个对象声明为指针:
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()