通过"指向类成员的指针"访问作为数组的类成员

Gau*_*v K 1 c++ pointers class

我写了下面的代码来探索类成员的指针:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

class Sample{
    public:
        int i;
        char name[35];
        char* City;

        Sample(int i,const char* ptr,const char* addr):i(i){
            strncpy(name,ptr,35);
            City= (char*) malloc(strlen(addr)*sizeof(char));
            strcpy(City,addr);
        }
};

int main()
{
    Sample Ob1(1,"Andrew Thomas","Glasgow");
    cout << Ob1.i << " : " << Ob1.name << " lives at : "<< (Ob1.City)<< endl;
    int Sample::*FI=&Sample::i;
    char* Sample::*FCity= &Sample::City;
    char* Sample::*FName=  &Sample::name;

    cout << Ob1.*FI << endl;
    cout << Ob1.*FCity << endl;
    cout << Ob1.*FName << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误char* Sample::*FName= &Sample::name;如下:

$ g++ -Wall ExploreGDB.cpp -o ExploreGDB
ExploreGDB.cpp: In function ‘int main()’:
ExploreGDB.cpp:28:34: error: cannot convert ‘char (Sample::*)[35]’ to ‘char* Sample::*’ in initialization
  char* Sample::*FName=  &Sample::name;
                                  ^
Run Code Online (Sandbox Code Playgroud)

其余的代码工作正常.

任何人都可以让我知道如何声明一个指向数据成员的指针声明为 - char name[35];

Man*_*rse 6

您需要声明指针如下:

char (Sample::*FName)[35]=  &Sample::name;
Run Code Online (Sandbox Code Playgroud)

一般规则是U (T::*<var_name>)声明指向T具有类型的类成员的指针U.这里的类型是char <var_name>[35],所以上面的语法是必需的.

另请注意,您malloc的错误.strlen给出字符串中的字符数,但为了表示这一点,你需要一个字符来终止null char:

City= (char*) malloc(strlen(addr)+1);
strcpy(City,addr);
Run Code Online (Sandbox Code Playgroud)