小编kmi*_*las的帖子

为什么访问器函数必须是const?漏洞在哪里?

当我在学校时,教授们把它敲进了我的脑海,同事们在代码审查中跳了起来,而且几乎所有的C++教科书都在那里:"访问者"(又名"选择器"或"getter")方法必须被标记const.如果它没有改变或改变数据,则标记它const.

为什么?如何调用访问者来修改私有数据?

在下面的示例中,我设置了一个简单的类和一个访问器.如何getBrand()用于修改私有数据?在我眼里,它不能; 那么我们为什么需要标记呢const

换句话说,我是否正确地说getBrand()在实践中不可能改变私有财产?

例:

#include <iostream>
#include <string>

class Cheese {
public:
    Cheese(std::string brand):brand_(brand) {}
    std::string getBrand() { return brand_; } // Intentionally not marked const
private:
    std::string brand_;
};

int main() {
    Cheese cheddar("Cabot clothbound");
    std::cout << "Brand: " << cheddar.getBrand() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ oop getter encapsulation const

3
推荐指数
1
解决办法
601
查看次数

如何正确完成python 3脚本

在 C++ 中,main()函数被标准化为类型int,因此应该return(0)可以成功执行。此外,程序通常会在最后打印一个换行符来刷新stdout,如下所示:

最小的、完整的、可验证的示例

hello_world.cpp

#include <iostream>
int main() {
    std::cout << "hello, world" << std::endl;

    printf("\n");
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

你好,世界

是否有等效的方法来正确退出 Python 脚本?还打印换行符,然后显式退出代码 0 是否有意义?

你好世界.py

import sys
print("hello, world")

print('\n')
sys.exit(0)
Run Code Online (Sandbox Code Playgroud)

你好,世界

Tyvm :^)

python return exit python-3.x

3
推荐指数
1
解决办法
1167
查看次数

MPMoviePlayerController:Seek按钮点击冻结视频 - 黑屏

我正在播放视频MPMoviePlayerController.在以下情况中,我得到一个黑屏,不响应控件上的点击:

  1. 用户点击快进按钮
  2. 用户点击倒带按钮
  3. 用户长时间保持,并快进到视频结束

所有其他控件按预期工作.

请注意,长按快进和快退确实可以正常工作.

我确实在下面的链接中查看了文档.有用户何时向前和向后寻求的通知(例如,长期持有); 分别MPMoviePlaybackStateSeekingForwardMPMoviePlaybackStateSeekingBackward.话虽如此,搜索按钮上没有simple_tap_的通知.

链接是" 这里 ".

为了完整性,这里是我用来调用播放器的代码.没有什么不寻常的; 当视频结束(观察MPMoviePlayerPlaybackDidFinishNotification)时,我倒回到开头.

NSString *path = [[NSBundle mainBundle] pathForResource:@"catSleeping" ofType:@mp4"];
_videoPlayer =  [[MPMoviePlayerController alloc]
                 initWithContentURL:[NSURL fileURLWithPath:path]];
[_videoPlayer prepareToPlay];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlayBackDidFinish:)
                                         name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:_videoPlayer];
_videoPlayer.controlStyle = MPMovieControlStyleFullscreen;
_videoPlayer.shouldAutoplay = YES;
[self.view addSubview:_videoPlayer.view];
[_videoPlayer setFullscreen:YES animated:YES];
[_videoPlayer play];
}

- (void) moviePlayBackDidFinish:(NSNotification*)notification {
    MPMoviePlayerController *player = [notification object];
    player.currentPlaybackTime = 0.1;
    [player stop];
    [player play];
    [player pause];
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

tyvm Keith …

objective-c freeze mpmovieplayercontroller ios

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

Apple Watch:检查配对状态?

是否有可用的课程可以告诉我手表是否已与设备配对?

我只是在寻找一个简单的是/否检查,它会告诉我手表是否与设备配对。

ios apple-watch

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

C++使用终结符的位置作为交换空间来反转以空字符结尾的字符串

我正在研究经典的"反向字符串"问题.

对交换空间使用空终止符的位置是个好主意吗?这个想法是保存一个变量的声明.

具体来说,从Kernighan和Ritchie的算法开始:

void reverse(char s[])
{
    int length = strlen(s);
    int c, i, j;

    for (i = 0, j = length - 1; i < j; i++, j--) 
    {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}
Run Code Online (Sandbox Code Playgroud)

......我们可以改为做以下事吗?

void reverseUsingNullPosition(char s[]) {
    int length = strlen(s);
    int i, j;

    for (i = 0, j = length - 1; i < j; i++, j--) {
        s[length] = s[i]; // Use last position instead of a new var …
Run Code Online (Sandbox Code Playgroud)

c++ string reverse

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

未找到架构x86_64的符号意味着类型转换无法正常工作

Xcode 7.2.1编译器.

为什么这不会编译?我希望第二行可以推断出类型,但是我发布了错误.谢谢.

int square(int);
template <typename T>
T square(T x) { return x * x; }

int main() {
    cout << square<int>(2) << endl; //Compiles, works
    cout << square(2) << endl; // Error below!?
    cout << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

c++ templates

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

为什么不使用LET作为可选抛出错误,因为它是对Swift Intro书中的零 - 不一致的隐式比较?

我正在阅读Swift文档,并挂断了我认为文档不一致的内容.

报价1 - 控制流程部分

if语句中,条件必须是布尔表达式 - 这意味着诸如得分{...}之类的代码是错误,而不是与零的隐式比较.

因此严格的"布尔"将为TRUE或FALSE.

引用2 - 控制流程部分

您可以使用iflet一起使用可能缺少的值.这些值表示为选项.可选值包含值或包含nil以指示缺少值.在值的类型后面写一个问号(?)以将值标记为可选

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}
Run Code Online (Sandbox Code Playgroud)

如果可选值为nil,则条件为false

因此,通过"布尔",它们似乎意味着"truthy/falsy",因为nil隐含地意味着错误

并跳过括号中的代码.否则,将解包可选值并在let之后其分配给常量,这使得在代码块内可用的展开值.

所以这里是我看到不一致的地方.在上面的代码示例中,由于optionalName具有值,因此该name变量被赋值为"John Appleseed".

因此,在比较中,我们最终得到了非布尔的表达 ; 特别是,"John Appleseed." 这是"真实的",但不是布尔值,这与第1点相矛盾!

换句话说 - 在代码中 - 在let中赋值后,我们有:

if "John Appleseed" {
    greeting = "Hello, \(name)"
} …
Run Code Online (Sandbox Code Playgroud)

conditional let optional swift xcode6

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

用于分配和检索的支架过载; const,参考

关于在C++中重载括号,我的编译器使用mutator方法进行访问.谁能告诉我为什么?

1. const int & Cheese::operator [] (int i)const { return weight[i]; } //accessor
2. int & Cheese::operator [] (int i) { return weight[i]; } //mutator
Run Code Online (Sandbox Code Playgroud)

例如,下面的cout命令使用mutator函数定义 - 上面的#2 - 来访问数据.

Cheese cheddar;
cout << cheddar[2] << endl;
Run Code Online (Sandbox Code Playgroud)

为什么这不使用第一个函数 - 访问器 - 来获取数据?我认为,因为cout只是一个检索,它会在第一个开始.

编译器如何知道调用哪些内容?

编辑:为了完整性,通过mutator,我的意思是用作"setter",就像这样:

cheddar[2] = 100;
Run Code Online (Sandbox Code Playgroud)

两者合在一起如下:

cheddar[2] = cheddar[1];
Run Code Online (Sandbox Code Playgroud)

rhs只是一个"吸气剂".它只是检索cheddar [1]的值,不会改变任何东西,因此可以是const.相比之下,lhs括号过载切达[2]起到"定位器"的作用.值可以改变,函数返回值不能是常量.

c++ overloading brackets accessor mutators

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

为什么不能将"PURE"定义为const设置为0以识别纯虚拟类?

尝试将关键字定义PURE为const集0,以用作抽象数据类型的类的标识符.为什么不编译?Per Meyers在"Essential C++,topic 1"中,我更喜欢使用const而不是#define,就像这样:

const int PURE = 0;
virtual void myFunction() = PURE;
Run Code Online (Sandbox Code Playgroud)

唉,这会引发错误(在Apple LLVM 7.0和gcc上也是如此):

Initializer on function does not look like pure-specifier
Run Code Online (Sandbox Code Playgroud)

下面是一个例子,标有A,B和C三种技术;

1. const int PURE = 0 will not compile
2. #define PURE 0 compiles and runs fine
3. Simply setting function = 0 (Stroustrup) works fine.
Run Code Online (Sandbox Code Playgroud)

它现在设置使用const解决方案,因此不会编译.简单地评论/取消注释第4,5,11和12行,以检查三种不同的方法:

#include <iostream>
#include <string>

const int PURE = 0;                  // Case B
// #define PURE 0                       // Case C …
Run Code Online (Sandbox Code Playgroud)

c++ pure-virtual

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

状态变量钩子不适用于 useEffect 回调

尝试在 React 功能组件中建立 WebSocket 连接,并使用钩子更新状态变量,如下所示 [参考 1]:

export default function foo() {
    const [ arr, setArr ] = useState([])
    ws = useRef(null)

    useEffect( () => {
        ws.current = new Websocket('ws://example.com:1234')
        ws.current.onmessage = (m) => {
            setArr([...arr, m])
        })
    }, []) // Runs once at mount
}
Run Code Online (Sandbox Code Playgroud)

的状态arr未保留。它被覆盖。

注意我也尝试传递arr到效果中,就像这样,但这导致了无限循环。[参考文献 2]。随着 arr 的更新,效果被称为...

        })
    }, [arr])
}
Run Code Online (Sandbox Code Playgroud)

举一个更具体的例子,取三个 websocket 消息:

['a']
['b']
['c']
Run Code Online (Sandbox Code Playgroud)

更新后每条消息的预计到达时间

['a']
['a', 'b']
['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

结果:

['a']
['b']
['c']
Run Code Online (Sandbox Code Playgroud)

为什么不与回调中的钩子arr一起存储? …

javascript state websocket reactjs react-hooks

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