我希望我的类仅Foo将其基类公开Bar为对Bar. 这意味着 的成员Bar可以读取,但不能设置。这是我尝试过的:
struct Bar
{
int member;
};
class Foo : protected Bar
{
public:
operator const Bar&() { return *this; }
};
Run Code Online (Sandbox Code Playgroud)
但在使用时,会出现以下问题:
int getBarMember( const Bar& bar )
{
return bar.member;
}
int main()
{
Foo myFoo;
const Bar& refBar = myFoo; // C2243
// const Bar& refBar = (const Bar&) myFoo; // always need to cast explicitly
int read = refBar.member;
int readByFunction = getBarMember( myFoo ); // …Run Code Online (Sandbox Code Playgroud) 我仍然不确定我是否完全了解这个特殊情况应如何解决.因此,如果我想声明一个不会改变的NSStrings数组,这是正确的吗?
static NSString * const strings[] = {@"String 1", @"String 2", ...};
Run Code Online (Sandbox Code Playgroud)
有static必要吗?(它做了什么?)我错过了一个额外的const地方吗?这里有太多的地方了!尔加!我做错了,还是我只是偏执狂?
我刚刚发现,当涉及到模板时,这个代码在g ++ 3.4.2中编译,并且除非不调用m(),否则它可以工作:
template <typename T>
class C
{
T e;
public:
C(): e(0) {};
void m()
{
e = 0;
};
};
Run Code Online (Sandbox Code Playgroud)
现在可以创建和使用实例
C<const int> c;
Run Code Online (Sandbox Code Playgroud)
直到c.m()没有被称为没有编译错误,但这是合法的吗?
basic_streambuf设置streambuf的三个"gptrs" 的成员setg被声明为:
protected:
void setg(char_type *gback, char_type *gptr, char_type *egptr);
Run Code Online (Sandbox Code Playgroud)
我想知道:为什么每个gptr的类型char_type*而不是const char_type*?const_cast在这里使用const char指针这些gptrs 是否安全?
我看到代码片段如下:
class UPNumber {
public:
UPNumber();
UPNumber(int initValue);
...
// pseudo-destructor (a const member function, because
// even const objects may be destroyed)
void destroy() const { delete this; } // why this line is correct???
...
private:
~UPNumber();
};
Run Code Online (Sandbox Code Playgroud)
首先,我确信上面的类定义是正确的.这是我的问题,为什么我们可以像上面那样定义函数'destroy'?问的原因是为什么我们可以在const-member函数中修改'this'?
我的库中有一个opaque类型定义为:
typedef struct MyOpaqueType* MyType; // easier to type for client code
Run Code Online (Sandbox Code Playgroud)
我不能使用typedef传递一个指向const的指针结构,所以有些函数看起来像:
void UsePointerToConst ( const struct MyOpaqueType * )
Run Code Online (Sandbox Code Playgroud)
代替:
void UserPointerToConst( const MyType ) // can't use, is really constant pointer
Run Code Online (Sandbox Code Playgroud)
所以,鉴于此,我有两个问题:参数列表中的struct关键字只在C中是必需的吗?有一个更好的方法吗?我应该创建一个typedef,例如:
typedef const struct MyOpaqueType* ConstantMyType; ?
Run Code Online (Sandbox Code Playgroud) 在一个对象中,我有一个const-handle数组到另一个特定类的某个对象.在方法中,我可能希望将此句柄之一作为inout参数返回.这是一个简化的例子:
class A {}
class B {
const(A) a[];
this() {
a = [new A(), new A(), new A()];
}
void assign_const(const(A)* value) const {
// *value = a[0]; // fails with: Error: cannot modify const expression *value
}
}
void main() {
const(A) a;
B b = new B();
b.assign_const(&a);
assert(a == b.a[0]); // fails .. obviously
}
Run Code Online (Sandbox Code Playgroud)
我不想删除原始数组中的const.类B是指对集合常量的某种视图 - A项.我是来自C++的D新手.我是否在D-way中搞乱了const-correctness?我已经尝试了几种方法让它工作,但不知道如何正确.
如果没有"邪恶"的投射,如何正确执行此查找?
一位同事和我正在讨论const或参考成员是否是正确的事情.const和引用成员使类不可复制且不可移动,除非您编写自己的副本并移动忽略引用或const成员的运算符.我找不到一个忽略复制或移动某些成员只是因为它们是引用或const有意义的情况.
我认为拥有一个不可移动的对象很少在逻辑上是合理的,并且是一个选择,它只与该类是否是位置不变有关.不可复制的对象更常见,但是使类不可复制的选择与它是否拥有逻辑上不可复制的资源,如果它代表唯一的所有权等有关.我想不出一个理由的唯一特征是拥有引用或const成员是否意味着该类应具有这些特征中的任何一种(不可复制或不可复制)
他们应该曾经被使用?应该是一个而不是另一个吗?有什么例子?
如果我使用相同类型的typedef,则以下代码在应用于const返回值引用时会起作用,value_type&但会出现错误.
举个例子:
class T {
};
class A {
public:
typedef T value_type;
typedef value_type& reference;
// Not working
const reference operator*() const;
// But this works?
//const value_type& operator*() const;
};
// Error!
const typename A::reference A::operator*() const {
}
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g ++会出错:
'const' qualifiers cannot be applied
Run Code Online (Sandbox Code Playgroud)
我的实际代码使用模板,但我删除了示例和替换类T.这与错误无关.
我不明白为什么这不起作用如果指定value_type&编译好.
我正在阅读 C++ Primer 第 5 版第 258 页。问题是,const 对象能否调用其非常量成员函数,即使该成员函数不修改其数据?
销售数据.h
#include <iostream>
#include <string>
struct Sales_data {
// data members
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
// memeber functions
const std::string isbn() const { return bookNo; }
Sales_data& combine(const Sales_data&);
double avg_price() const { // *
if (units_sold) {
return revenue / units_sold;
}
return 0.0;
}
};
std::ostream& print(std::ostream &os, const Sales_data& data) {
os << data.isbn() << " " << data.units_sold << " " …Run Code Online (Sandbox Code Playgroud)