【问题标题】:How do I access to private member variable from another class whose member variable is instance of first class?如何从另一个成员变量是第一类实例的类访问私有成员变量?
【发布时间】:2021-04-04 11:26:40
【问题描述】:

首先,感谢您的帮助。 我一直在学习C,最近才开始学习C++。

我正在尝试找出新的面向对象的概念。

例如,

class Contact{
    private:
        char name[30];
        char birthday[10];
        char email[30];
        char phone[20];
   public:
        char* getname();
        char* getbirthday();
        char* getemail();
        char* getphone();
        void setname(char* x);
        void setbirthday(char* y);
        void setemail(char* z);
        void setphone(char* w);
};
class ContactArray
{

    private:
    friend class contactArray;
        int max_size;
        Contact **contact1;
    public:
        friend class contactArray;
        ContactArray(int num)
        {
            int i;
            max_size = num;
            contact1 = new Contact*[max_size];
            
            for(i = 0; i <max_size ;i++)
            {
            contact1[i] = new Contact();
            }
            
        }
};

这是我现在正在使用的类,但是如果我尝试访问“char name[30]”,我的程序将在使用“getname()”函数的地方停止。简而言之,

ContactArray *contactArray;
contactArray = new ContactArray(6);

如果我创建这样的实例,那么如果我创建名为 read_data 的 ContactArray 的公共方法,

void ContactArray::read_data(char* filename)
{
.........
....

fgets(str, BUFSIZE,fp);
ptr = strtok(str,";")
contact1[i]->setname(ptr);

printf("%s", contact1[i]->getname());//program stops here-----> here

}

如果我尝试通过 getname() 检查“setname(ptr)”是否正常工作,它会停止,所以我无法检查。 读取文件或标记化等其他事情工作正常,因为我可以检查它们 我使用基于 C 的函数表示歉意,我仍在学习 C++ 但请忽略它们。

我认为这与内存分配有关,但不太清楚为什么。 帮帮我


    char* Contact::getname()
{
           char* n;
            strcpy(n,name);
            
            return n;
}

这是getter函数

【问题讨论】:

  • 尝试将contact1[i]-&gt;getname(ptr) 更改为contact1[i]-&gt;getname()
  • 这不应该“停止”。这甚至应该拒绝编译。您没有带参数的 getname 函数。将来,如果您可以将实际的错误消息复制粘贴到您的问题中,它将帮助人们回答。
  • 哦,这是一个错字,它应该是 getname() 而不是 getname(ptr)。我的坏
  • 只是我没有提到getname的定义。我有它我会编辑它一秒钟

标签: c++ arrays class


【解决方案1】:

Contact::getname() 函数中的“n”指针在传递给 strcpy() 时未初始化。 这意味着 strcpy() 将尝试将字符串复制到执行时恰好位于“n”指针中的任何内存地址(该地址可以是任何值,因为变量未初始化,并且很可能会导致崩溃)。您应该在 strcpy() 之前使用n = new char[30]; 分配新内存。

更好的是,您应该改用strncpy() 函数,否则如果“name”字符串不是以空值结尾的(这也可能发生在此处),您的程序将执行缓冲区溢出。

既然您提到您正在从 C 中学习 C++,我建议您查看 std::string 类,它为您处理几乎所有的内存管理麻烦。

【讨论】:

  • 这解释得很好。非常感谢哇。
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多