[尝试从()运算符返回成员字符串时发生读取访问冲突

问题描述 投票:0回答:2

我有一个带有成员变量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);
}

为什么会这样?

c++ access-violation
2个回答
1
投票

我认为这里有两个错误。

[首先,我认为您正在尝试编写转换运算符。正确的语法是

operator wchar_t *() {

不是

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;
}

2
投票

您应该有这个来调用opearator():

 printf("%ws", c());

0
投票

我认为这里有两个错误。

[首先,我认为您正在尝试编写转换运算符。正确的语法是

operator wchar_t *() {

不是

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.