#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);
}
};
- Это выдает мне ошибку при компиляции. В нем говорится, что hwnd в GetWindowTextA недоступен.
Как получить hwnd?
- Нет ли каких-либо: 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
это astd::string
, но если это так, используйтеc_str
метод, чтобы получить achar*
изstring
. С приведением вы сказали компилятору, чтоstring
это achar*
, а это не так.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) и иметь доступ к переменным верхнего класса