相关疑难解决方法(0)

为什么Visual Studio 2010调试器不能看到静态const类成员?

这个问题与此后提出的问题密切相关.

Stroustrup 在这里描述了定义类内常量的方法.

当我按照Stroustrup的方法时,我看到了预期的结果.但是,在Visual Studio 2010中,调试器无法解析static const该类范围内的类成员.这就是我的意思:

#include <iostream>

class Foo {
   public:
    static const int A = 50;
    char arr[A];
    void showA();
};

void Foo::showA() {
    std::cout << "showA = " << A << "\n";
}

int main() {
    Foo f;
    f.showA();
}
Run Code Online (Sandbox Code Playgroud)

当调试器在showA()中时,"监视"窗口报告:

Error: Symbol "Foo::A" not found
Run Code Online (Sandbox Code Playgroud)

我想强调该程序的行为符合预期,即输出为:

showA = 50
Run Code Online (Sandbox Code Playgroud)

并且程序返回0.

其他人可以用Visual Studio 2010重现这个吗?这是调试器中的错误吗?

c++ compiler-construction gcc debuggervisualizer visual-studio

8
推荐指数
2
解决办法
4549
查看次数

如何在使用pimpl习语时创建私有静态const字符串

背景

我一直在学习如何使用Herb Sutter在本页描述的更新的c ++ 11方法来实现pimpl习语:https://herbsutter.com/gotw/_100/

我试图通过向私有实现添加成员变量来修改此示例,特别是std :: string(尽管char*具有相同的问题).

问题

由于使用了静态const非整数类型,这似乎是不可能的.类内初始化只能对整数类型进行,但由于它是静态的,因此也无法在构造函数中初始化.

这个问题的解决方案是在头文件中声明私有变量,并在实现中初始化它,如下所示: C++ static constant string(class member)

但是,这个解决方案对我不起作用,因为它打破了我试图通过pimpl习语实现的封装.

在使用pimpl习语时,如何在隐藏的内部类中隐藏非整数静态const变量?

这是我能想出的最简单(不正确)的例子:

Widget.h:

#ifndef WIDGET_H_
#define WIDGET_H_

#include <memory>

class Widget {
public:
    Widget();
    ~Widget();
private:
    class Impl;
    std::unique_ptr<Impl> pimpl;
};

#endif
Run Code Online (Sandbox Code Playgroud)

Widget.cpp:

#include "Widget.h"
#include <string>

class Widget::Impl {
public:
    static const std::string TEST = "test";

    Impl() { };
    ~Impl() { };
};

Widget::Widget() : pimpl(new Impl()) { }
Widget::~Widget() { }
Run Code Online (Sandbox Code Playgroud)

编译命令:

g++ -std=c++11 -Wall -c …
Run Code Online (Sandbox Code Playgroud)

c++ pimpl-idiom c++11

5
推荐指数
1
解决办法
345
查看次数

如何初始化静态成员

我想初始化两个静态数据成员.请参阅这两个文件

// Logger.h   

class Logger
{
    public:
        static LoggerConcrete error;
        static LoggerConcrete write;
};
Run Code Online (Sandbox Code Playgroud)

//Logger.cpp

Logger::error = LoggerConcrete(LOG_DEBUG);
Logger::write = LoggerConcrete(LOG_DEBUG);
Run Code Online (Sandbox Code Playgroud)

在Logger.cpp中启动两个静态成员不起作用.我得到以下编译器(g ++)错误:

g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP -MF"Logger.d"-MT"Logger.d"-o"Logger.o""../ Logger.cpp".. /Logger.cpp:13:错误:在'='标记之前的预期构造函数,析构函数或类型转换../Logger.cpp:14:错误:在'='标记之前的预期构造函数,析构函数或类型转换

我想在包含Logger.h的每个类中使用Logger :: write和Logger :: error.我如何初始化这两个成员?

c++ static initialization

4
推荐指数
2
解决办法
2415
查看次数

如何访问另一个源文件中“结构”的静态成员

我正在创建一个小程序来进行计费。我正在尝试访问在另一个源文件中的头文件中声明的静态成员 static double total 。Java 是我的第一门语言,因此在用 C++ 对其进行分类时遇到了麻烦。

当我尝试时,出现以下错误。

bill.cpp(16):错误 C2655:'BillItem::total':定义或重新声明在当前范围内非法

bill.h(8):注意:参见'BillItem::total'的声明

bill.cpp(16): 错误 C2086: 'double BillItem::total': 重新定义

bill.h(8): 注意:见“total”的声明

我怎样才能使它可用。谷歌搜索错误没有帮助。

我想要实现的是在一个结构中创建一个静态双变量,这对所有结构实例都是通用的。我需要在另一个源文件中访问这个静态变量,我将在其中进行计算。

比尔.h

#pragma once

struct BillItem
{
public:
    static double total;
    int quantity;
    double subTotal;
};
Run Code Online (Sandbox Code Playgroud)

比尔.cpp

#include<iostream>
#include "Item.h"
#include "Bill.h" 

void createBill() {
    double BillItem::total = 10;
    cout << BillItem::total << endl;
}
Run Code Online (Sandbox Code Playgroud)

主代码.cpp

#include <iostream>
#include "Bill.h"

int main() {
    createBill();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ struct static-members

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

C++类公共字符串常量

在C++中,我想定义一些将在类中使用的字符串,但这些值在所有实例中都是通用的.在CI中会使用#defines.这是一个尝试:

#include <string>
class AskBase {
public:
    AskBase(){}
private:
    static std::string const c_REQ_ROOT = "^Z";
    static std::string const c_REQ_PREVIOUS = "^";
    static std::string const c_REQ_VERSION = "?v";
    static std::string const c_REQ_HELP = "?";
    static std::string const c_HELP_MSG = "  ? - Help\n ?v - Version\n ^^ - Root\n  ^ - Previous\n ^Z - Exit";
};
int main(){AskBase a,b;}
Run Code Online (Sandbox Code Playgroud)

如果需要C++ 0x,那是可以接受的.

c++ c++11

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

对构造函数的调用不能出现在常量表达式中

我很抱歉我的新手问题,但我对C++知之甚少.任何人都可以回答为什么我在编译下面的代码时得到错误"错误:对构造函数的调用不能出现在常量表达式中";

class EliminationWeight
{
 public:
    typedef double Type;
    static const Type MAX_VALUE = __DBL_MAX__;
    static const Type MIN_VALUE = -__DBL_MAX__;
};
Run Code Online (Sandbox Code Playgroud)

我使用Ubuntu 12.04和随附的gcc.这不是我的代码,我知道这个代码可能100%正常工作(可能在旧版本的gcc或其他编译器中).有没有快速解决方法?

在此先感谢您的回答,这实际上是我第一次问SO.

c++

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

使用类的const成员使用std :: deque :: erase编译错误

我在这里得到一个编译错误,我不知道代码有什么问题.我正在使用g ++ 4.9.2.

#include<iostream>
#include<deque>

using std::string;
using std::deque;

class Dummy {
public:
    virtual ~Dummy(){};
    Dummy():ID_("00") {};
private:

    const string ID_;
};

int main(){
    {
    deque <Dummy> waiter;
    waiter.push_back(Dummy());
    waiter.erase( waiter.begin() );
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我知道删除const会删除编译错误,但我不知道为什么.无论如何,我需要这个const.

c++ stddeque

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

是否需要单独定义C++中的类或结构的常量静态成员变量?

是否需要单独定义C++中的类或结构的常量静态成员变量?

它是否正确?

struct test
{
    const static int x;
};

int test::x;
Run Code Online (Sandbox Code Playgroud)

c++ static const

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