这个问题与此后提出的问题密切相关.
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
我一直在学习如何使用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) 我想初始化两个静态数据成员.请参阅这两个文件
// 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.我如何初始化这两个成员?
我正在创建一个小程序来进行计费。我正在尝试访问在另一个源文件中的头文件中声明的静态成员 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++中,我想定义一些将在类中使用的字符串,但这些值在所有实例中都是通用的.在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++知之甚少.任何人都可以回答为什么我在编译下面的代码时得到错误"错误:对构造函数的调用不能出现在常量表达式中";
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.
我在这里得到一个编译错误,我不知道代码有什么问题.我正在使用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++中的类或结构的常量静态成员变量?
它是否正确?
struct test
{
const static int x;
};
int test::x;
Run Code Online (Sandbox Code Playgroud)