Нарушение прав чтения при попытке вернуть строку-член из оператора () - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть класс с переменной-членом wchar_t m_var[MAX_PATH];

Я пытаюсь вернуть его, используя перегруженный оператор wchar_t* operator()(). Также попробовал const wchar_t* на всякий случай. Внутри есть просто return m_var;, но, к сожалению, я всегда получаю нарушение прав на чтение.

Когда я просто пишу MyClass.m_var, он работает отлично.

Я получаю эту ошибку через код printf("%ws", MyClass);, но не printf("%ws", MyClass.m_var);

#include <cstdio>

class MyClass {
public:
    MyClass() { random_op(); }
    ~MyClass() {}
    void random_op() {
        for(int i = 0; i <= 11; i++) {
            m_var[i] = 'A';
        }
        m_var[12] = '\0';
    }
    wchar_t* operator()() { return m_var; }
    wchar_t m_var[255];
};

int main() {
    MyClass c;
    printf("%ws", c);
}

Почему это происходит?

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Вы должны иметь это, чтобы вызвать opearator ():

 printf("%ws", c());
1 голос
/ 07 апреля 2020

Я думаю, что здесь есть две ошибки.

Сначала я думаю, что вы пытаетесь написать оператор преобразования. Правильный синтаксис для этого:

operator wchar_t *() {

not

wchar_t * operator()() {

Вторая ошибка в том, что обычные преобразования типов не применяются при вызове printf (и аналогичных), потому что нет никакого способа чтобы компилятор знал, какие типы ожидаются.

Таким образом, этот код будет работать (но не проверен).

#include <iostream>

class MyClass {
public:
    MyClass() { random_op(); }
    ~MyClass() {}
    void random_op() {
        for(int i = 0; i <= 11; i++) {
            m_var[i] = 'A';
        }
        m_var[12] = '\0';
    }
    operator wchar_t* () { return m_var; }
    wchar_t m_var[255];
};

int main() {
    MyClass c;
    std::wcout << c;
}
...