小编use*_*186的帖子

C++ std :: map持有任何类型的值

基本上我想要的是认为,字段名(字符串)映射到任何类型值的一个HashMap为此我写了持有型和价值信息的单独MyField的MyClass类..

这是我到目前为止:

template <typename T>
class MyField {
    T m_Value;
    int m_Size;
}


struct MyClass {
    std::map<string, MyField> fields;   //ERROR!!!
}
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,地图声明失败,因为我没有为MyField提供类型参数...

所以我想它必须是这样的

std::map< string, MyField<int> > fields;
Run Code Online (Sandbox Code Playgroud)

要么

std::map< string, MyField<double> > fields;
Run Code Online (Sandbox Code Playgroud)


但显然这会破坏我的整个目的,因为声明的地图只能保存特定类型的MyField.我想要一个可以容纳任何类型的MyField clas的地图.

有什么办法可以实现这个目的吗?

c++ templates

25
推荐指数
5
解决办法
3万
查看次数

捕获c ++"访问冲突写入异常"?

在我的c ++代码中,我有一段代码,它给我一个"访问冲突写入位置..."当用户输入无效时的例外.

我试图在我的try/catch块中捕获此异常,以便在发生异常时显示错误消息..但由于某种原因它没有捕获错误.

try {
    // ... some code that causes Access Violation Writing Location Exception
}
catch (...) {
    std::cout << "invalid user input" << endl;
}
Run Code Online (Sandbox Code Playgroud)

我这样做了,但是当异常发生时,控制台不会显示我的错误消息,但是说有一个

Unhandled exception at 0x0F0B0E9A (msvcr110d.dll) in Example.exe : Access violation writing location
Run Code Online (Sandbox Code Playgroud)

所以看起来我的try/catch块没有捕获异常......

我设置了断点以确保在try块中发生异常..而且我100%就是这种情况..

为什么"catch(...)"没有捕获Access Violation异常?

c++ memory exception

4
推荐指数
1
解决办法
1万
查看次数

C++结合#define和#ifndef宏

我想知道是否有办法结合#define和#ifndef宏..

这意味着我想在#define宏中使用#ifndef宏.

由于它很难解释,这是我想要做的一个例子:

#define RUN_IF_DEBUG                \
    #ifndef DEBUG_MODE              \
        ;      // do nothing        \
    #else                           \
        cout << "Run!" << endl;     \
    #endif

int main() {
    RUN_IF_DEBUG
}
Run Code Online (Sandbox Code Playgroud)

所以我希望RUN_IF_DEBUG宏只在DEBUG_MODE被定义的情况下运行...

有没有办法做到这一点?

c++ macros

2
推荐指数
1
解决办法
455
查看次数

C++ 矢量 Push_back 产生奇怪的副作用

当我使用STL向量存储类对象时,我观察到一个非常奇怪的副作用,其中push_back方法修改了现有数据!

基本上我有一个包含多个字段的类,如下所示:

class MyClass {
    MyClass(std::string s, int i) {
        StringValue = s;
        IntValue = i;
    }

    std::string StringValue;
    int IntValue;
}
Run Code Online (Sandbox Code Playgroud)

我有一个向量,其中包含指向 MyClass 对象的指针..然后我基本上推回对对象的引用:

std::vector<MyClass*> MyVector;
MyClass c1("CLASS 1", 1);
MyClass c2("CLASS 2", 2);

MyVector.push_back(&c1);
// Result:
// *MyVector[0]    ==>    ("Class 1", 1)



MyVector.push_back(&c2);
// Result:
// *MyVector[0]    ==>    ("Class 2", 2)   ??why 2??
// *MyVector[1]    ==>    ("Class 2", 2)
Run Code Online (Sandbox Code Playgroud)

你看到我得到的奇怪结果了吗?我在每个push_back语句之后设置了断点,并且发生了这种奇怪的事情。

第一个 Push_back 语句工作正常。但是第二个push_back语句修改了第一个元素的内容,这对我来说没有意义。

我假设它与我存储引用而不是向量内的实际对象有关......但我无法弄清楚出了什么问题。

我该如何处理这个问题?有什么见解吗?

谢谢


更新:

(简化代码)

MyClass c1("CLASS 1", 1);
MyClass c2("CLASS …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference vector

0
推荐指数
1
解决办法
1107
查看次数

c ++将一个std :: string转换为另一个

正如你可能从我的问题中得知的那样,我是一个c ++新手

我不确定将一个字符串的值复制到另一个字符串的正确方法是什么.

比如我这样做了:

std::string x = "this is x";
std::string y = "this is y";
x = y;
Run Code Online (Sandbox Code Playgroud)

没有错误,但这没有做任何事情..

我知道有字符串:: copy ...但似乎这个函数需要缓冲区大小等...这很烦人..

有没有一种简单的方法在c ++中完成这项工作?

谢谢

UPDATE!

对不起,我觉得我的答案太简单了.....这是我的情况:

class MyClass {
    std::string m_str = "OLD STRING";
}

void CopyString(MyClass& c, std::string x) {
    c.m_str = x;
}

int main() {
    MyClass c;
    CopyString(c, "NEW STRING");

    std::cout << c.m_str << std::endl;           // prints "OLD STRING"!!
}
Run Code Online (Sandbox Code Playgroud)

c++ string pointers

-6
推荐指数
1
解决办法
79
查看次数

标签 统计

c++ ×5

pointers ×2

exception ×1

macros ×1

memory ×1

reference ×1

string ×1

templates ×1

vector ×1