класс в классе — как получить основные переменные класса

#c

#c

Вопрос:

 class buttonClass {
  HWND hwnd;
  class TextClass {
    const int TextClassMaxLen = 100;
  public:
    operator string () { 
        string windowText(TextClassMaxLen);
        GetWindowTextA(hwnd, (char*)windowText, TextClassMaxLen);
        return windowText;
    }
  };
public:
  TextClass Text;
  buttonClass(HWND parent) {
      HINSTANCE moduleHandle = GetModuleHandle(0);
      hwnd = CreateWindowA("BUTTON", "temp", WS_CHILD | WS_VISIBLE, 1, 1, 150, 30, parent, NULL, moduleHandle, NULL);
  }
};
 
  1. Это выдает мне ошибку при компиляции. В нем говорится, что hwnd в GetWindowTextA недоступен.

Как получить hwnd?

  1. Нет ли каких-либо: friend stringamp; operator=(stringamp; paramString, TextClassamp; paramTextClass);

Я делаю

 buttonClass button(parent);

string myString=button.Text;
 

Я предполагаю, что нет operator=, поэтому я делаю это путем преобразования в строку.

Как лучше всего это сделать?

Комментарии:

1. «Класс в классе» — это отвлекающий маневр. Как бы вы решили это, если бы это был не класс в классе, а скорее два отдельных класса? Вы должны сделать это и здесь. Это 2 разных класса. Тот факт, что один является частным классом другого класса, означает только то, что он виден только указанному классу. Ничего больше.

2. Из какого buttonClass экземпляра следует hwnd брать элемент?

3. Примечание: не делайте этого : (char*)windowText . Я бы почти сказал, что никогда не используйте приведение в стиле c для преобразования типа. Он отключает все защиты типов компиляторов и преобразует ошибку компилятора в ошибку времени выполнения, где ее будет намного сложнее определить. Я не могу быть на 100% уверен, что string это a std::string , но если это так, используйте c_str метод, чтобы получить a char* из string . С приведением вы сказали компилятору, что string это a char* , а это не так.

4. Похоже, что такая функция FetchText() была бы более подходящей, чем элемент данных с оператором преобразования. Это то, что люди ожидают от API.

5.При переосмыслении используйте string data метод ‘s вместо c_str . GetWindowTextA требуется не- const char* . Если ваши инструменты старше и не имеют data метода, вы, вероятно, можете использовать amp;windowText[0] . Технически это не поддерживается, но я никогда не видел, чтобы это не работало.

Ответ №1:

Я не думаю, что доступ к hwnd из TextClass — это хороший стиль, но вот решение.

Сделайте TextClass другом buttonClass.

Изменить

 class TextClass {
 

Для

 friend class TextClass {
 

Затем он будет иметь доступ ко всем закрытым переменным-членам в buttonClass.

Комментарии:

1. но я использую operator string() внутри TextClass, поэтому я не предоставил ни одного экземпляра buttonClass . Как перегрузить этот оператор и получить доступ к переменной верхнего класса? Будет ли какой-либо пример кода? Я хотел бы также перегрузить operator =(int otherInt) и иметь доступ к переменным верхнего класса