小编πάν*_*ῥεῖ的帖子

通过getter和setter(访问器)函数访问私有变量的重点是什么?

在类中,变量通常被私有化以用于封装,并且将变量限制到特定范围允许更好的错误控制和更少的错误.这是有道理的,因为可以访问变量的位置越少,该变量发生错误的位置就越少.

但是,我总是看到变量变为私有,然后使用getter和setter函数来检索该值(有时甚至是指向该变量的指针!).例如int a是私人防止公共访问,但后来getA()setA()允许他们直接访问.

那么,getter函数和setter函数是否违背了它的私有性?我的意思是具有访问器功能的私有变量与公共变量相同,只有访问它们的代码才会发生变化.(object.variable vs object.getVariable())

是否有人使用访问器函数将变量设为私有?与公开相比有什么优势吗?

我说的是一般的编程,但主要是C语言(即C,C++,C#,Obj-C).

oop encapsulation class object

10
推荐指数
1
解决办法
3059
查看次数

我为什么不使用__fastcall而不是标准__cdecl?

我会听一些人说__fastcall比这更快__cdecl并且__stdcall导致它将两个参数放入寄存器,而不是其他一个调用; 但是,另一方面,这不是C中使用的标准.

我想知道什么是__fastcall不合适的,就像C中的标准,以及何时我将在我的代码中使用它.

c c++ function-calls cdecl fastcall

10
推荐指数
1
解决办法
3588
查看次数

使用花括号将初始值临时值初始化为静态数据成员会导致错误

这个非常简单的代码在GCC 6.0中出错:

template<class T>
struct S {
    // error: cannot convert 'T' to 'const int' in initialization
    static const int b = T{};
};

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

奇怪的是,如果我使用常规大括号(T()),那么代码就会编译.这是一个错误吗?代码在clang中编译得很好.

c++ gcc c++11

10
推荐指数
1
解决办法
213
查看次数

C++ 11(或更新版本)中创建RAII包装器而不必编写新类的最短路径是什么?

我常常需要一个简单的RAII包装器,但我不想为此创建一个全新的类,原因很多,包括时间限制和组织问题.我的快速解决方案如下.

假设我想确保在范围结束时,我想要一个布尔值切换回其原始状态:

bool prevState = currState;
currState      = newState;
std::unique_ptr<int, std::function<void(int*)>> txEnder(new int(0), [&prevState](int* p) {
    currState = prevState;
    delete p;
});
Run Code Online (Sandbox Code Playgroud)

这个解决方案工作正常,但脏部分是必须分配和释放该整数只是为了使unique_ptr工作和破坏时调用自定义析构函数.

有没有一个更清洁的方法来做这个,而不必写一个完整的类,并摆脱new假人int

c++ raii c++11 c++14 c++17

10
推荐指数
2
解决办法
470
查看次数

如果我没有使用新关键字,我可以有内存泄漏吗?

我是这门语言的新手,我对内存泄漏有一个基本的疑问.如果我不使用new关键字,是否可能发生泄漏?(即在堆栈中使用我的变量并使用数据容器std::vector)

我应该担心这个问题吗?

如果是这种情况,有人可以给我一个例子,说明在没有动态分配内存的情况下造成泄漏吗?

c++ memory-leaks

10
推荐指数
2
解决办法
347
查看次数

使用可变参数模板的功能模板重载:英特尔c ++编译器版本18产生的结果与其他编译器不同。英特尔错了吗?

考虑以下代码片段:

template<typename T, template<typename, typename ...> class A, typename ... Ts>
int a(A<T, Ts...> arg){
  return 1; // Overload #1
}

template<typename A>
int a(A arg) {
  return 2;  // Overload #2
}

template<typename T>
struct S{};

int main() {
  return a(S<int>());
}
Run Code Online (Sandbox Code Playgroud)

a使用模板类的实例调用函数时,我希望编译器选择更特殊的函数重载#1。根据编译器资源管理器的说法,直到版本17的clang,gcc和intel确实选择了#1重载。相反,后来的intel编译器版本(18和19)选择#2重载。

代码定义不正确吗?还是最新的intel编译器版本错误?

c++ templates language-lawyer variadic-templates

10
推荐指数
1
解决办法
141
查看次数

C中指向char的指针的默认值

让我们有变量 char *s;

我知道如果它在全局范围内声明,它的值应为0;

如果它在本地范围内声明,则其值未定义(尽管可能为0).

我在测试中有一个问题听起来像'定义为指针的值是什么

char* s
Run Code Online (Sandbox Code Playgroud)

a)null
b)空字符串
c)未定义

我真的很困惑我应该选择什么答案,因为如果它在全局范围内声明,那么该值将为null(我猜).如果它在本地范围内声明,未定义(虽然当我尝试它为零时),当我尝试cout它时,没有打印任何内容(没有分段错误,为什么?),这意味着它是一个空字符串(或者是cout那么棒?).

c c++ pointers

9
推荐指数
1
解决办法
2564
查看次数

'ld:未知选项:-rpath =./ libs' - 在mac os 10.7.5上构建openframework插件时链接错误

我对编码很新,我正在尝试构建一个openframework插件的示例项目,称为ofxReprojection.我去的时候:

cd /Users/Macbookpro/Documents/openframeworks/addons/ofxReprojection/example-ofxKinect 
Run Code Online (Sandbox Code Playgroud)

然后

make
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ld: unknown option: -rpath=./libs
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [bin/example-ofxKinect] Error 1
make: *** [Release] Error 2
Macbooks-MacBook-Pro:example-ofxKinect Macbookpro$ 
Run Code Online (Sandbox Code Playgroud)

我有Mac OS 10.7.5.

为了艺术,我希望有人可以提供帮助:)

c++ macos

9
推荐指数
2
解决办法
3330
查看次数

为什么“ stdint.h”的实现在UINT8_C的定义上存在分歧?

UINT8_C宏在“stdint.h”中定义,用下面的说明书UINTN_C(value)应扩展到对应于该类型的整数常量表达式uint_leastN_t

但是,在一般情况下,实现方式有所不同:

#define UINT8_C(value) ((uint8_t) __CONCAT(value, U))  // AVR-libc
#define UINT8_C(x_)    (static_cast<std::uint8_t>(x_)) // QP/C++
#define UINT8_C(c)     c                               // GNU C Library
Run Code Online (Sandbox Code Playgroud)

前两个实现看起来大致相同,但是第三个实现的行为有所不同:例如,以下程序1使用AVR-libc和QP / C ++进行打印,但是-1使用glibc(因为有符号值的右移会传播符号位)。

std::cout << (UINT8_C(-1) >> 7) << std::endl; // prints -1 in glibc
Run Code Online (Sandbox Code Playgroud)

display的实现UINT16_C显示相同的行为,但不显示UINT32_C,因为其定义包括U后缀:

#define UINT32_C(c) c ## U
Run Code Online (Sandbox Code Playgroud)

有趣的是,由于有错误报告,glibc 在2006年UINT8_C更改定义。先前的定义为,但是由于整数提升规则而产生了错误的输出()。#define UINT8_C(c) c ## Ufalse-1 < UINT8_C(0)

根据标准,所有三个定义是否正确?这三个实现之间是否还有其他区别(除了负数的处理)?

c c++ standards integer-promotion stdint

9
推荐指数
2
解决办法
386
查看次数

如果不推荐使用 std::iterator ,我们还应该使用需要 std::iterator 的类或函数吗?

我听说std::iterator在 C++17 中不推荐使用。

例如,像功能<algorithm>,更可能我们要使用begin()end()它返回迭代器对象,如成员函数std::stringstd::vector等等。

或者像基于范围的 for 循环,我们需要的地方begin()以及end()返回迭代器的地方。

因此,如果std::iterator基类被弃用,我们是否应该使用成员函数,如begin()end()或使用 STL 中需要迭代器的其他函数?

c++ iterator for-loop c++17

9
推荐指数
2
解决办法
329
查看次数