当涉及到c ++时,我很吵,返回对象的更好方法是什么?我来自脚本世界,其中对象总是引用,并且我试图实现相同的概念......我基于何时通过引用传递以及何时通过C++中的指针传递?,一个用户说:"一个好的经验法则:"当你需要时使用引用,当你需要时使用指针"."
// basic layer class
class Layer { private: Channel channel; // NEVER NULL };
// return object by pointer
Channel *Layer::getChannel() {
return &channel;
};
// return by reference
Channel& Layer::getChannel() {
return channel;
};
Run Code Online (Sandbox Code Playgroud)
第二个版本的问题是编译器将接受这一行:
Channel channel = layer.getChannel(); // creates a copy BAD
Run Code Online (Sandbox Code Playgroud)
应该是什么时候:
Channel &channel = layer.getChannel(); // reference good
Run Code Online (Sandbox Code Playgroud)
有没有办法强制第二个选项的调用者强制它不创建新的通道,或者是第一个选择更好,即使它永远不会是NULL?
我来自世界各地,并且一直在寻找谷歌关于做多个包装来垂直对齐内容的资源 - 但它似乎真的很难看.
现在使用HTML5有一种更简单的方法吗?是否有某种实现使用类似HBox/VBox的心态?我看到有非浏览器的例子 - 有合规的方式吗?
现在,任何心智正常的人都能做HTML吗?一团糟!
////编辑
我终于想出了如何在屏幕上垂直对齐整个框,我如何确定如何垂直居中列表项.
我已经尝试了两种方法来对齐这个html:
<nav>
<ul>
<li><a href="#!/home">Home</a></li>
<li><a href="#!/link1">Link #1</a></li>
</ul>
</nav>
Run Code Online (Sandbox Code Playgroud)
一个使用display:inline,另一个使用float:left(在容器内).当使用内联时,似乎列表项忽略height:css,并且当使用float:时,li中的链接不会垂直对齐.我是否需要将div放在li中以使它们垂直居中?
我正在寻找一些新的GLSL代码,它不能编译到我当前的OpenGL版本,我想知道以下简短形式是什么意思:
vec4 base;
if (base < 0.5) {
result = (2.0 * base * blend);
}
Run Code Online (Sandbox Code Playgroud)
这相当于:
if (base.r < 0.5 && base.g < 0.5 && base.b < 0.5 && base.a < 0.5) {
result.r = 2.0 * base.r * blend.r;
result.g = 2.0 * base.g * blend.g;
result.b = 2.0 * base.b * blend.b;
result.a = 2.0 * base.a * blend.a;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
Error:
Fragment shader failed to compile with the following errors:
Wrong operand types no operation '<' …Run Code Online (Sandbox Code Playgroud) 这应该很简单:我正在使用boost文件系统编写一个绝对路径,但是它返回了一条非常丑陋的路径:
D:/Projects/SomeDir/vc10/../resource/plugins/SomeFile.dll
Run Code Online (Sandbox Code Playgroud)
是否有一种自动处理的增强方式.和...的?
我所做的只是:
boost::filesystem::complete("../resource/plugins/SomeFile.dll")
Run Code Online (Sandbox Code Playgroud)
它使用boost :: filesystem2.
我还在学习c ++,所以请耐心等待.我正在编写一个关于boost文件系统路径的简单包装器 - 我在返回临时字符串方面遇到了奇怪的问题.这是我的简单类(这不是确切的,但非常接近):
typedef const char* CString;
typedef std::string String;
typedef boost::filesystem::path Path;
class FileReference {
public:
FileReference(const char* path) : mPath(path) {};
// returns a path
String path() const {
return mPath.string();
};
// returns a path a c string
CString c_str() const {
return mPath.string().c_str();
};
private:
Path mPath;
}
Run Code Online (Sandbox Code Playgroud)
使用下面的小测试代码:
FileReference file("c:\\test.txt");
OutputDebugString(file.path().c_str()); // returns correctly c:\test.txt
OutputDebugString(file.c_str()); // returns junk (ie îþîþîþîþîþîþîþîþîþîþî.....)
Run Code Online (Sandbox Code Playgroud)
我很确定这必须处理临时工,但我无法弄清楚为什么会这样 - 不应该一切都正确复制?
一个 C++ n00b 问题。是否可以从 cpp 中定义的静态方法调用私有构造函数?如果可能的话,我想将方法保留在头文件之外——我认为应该有一种方法可以做到这一点。我在尝试此操作时遇到错误:
“无法访问类 SomeClass 中声明的私有成员”
/////////////////
// SomeClass.h //
/////////////////
class SomeClass {
public:
static SomeClass SomeMethod();
private:
SomeClass(int i);
}
///////////////////
// SomeClass.cpp //
///////////////////
static SomeClass OSImplementation() {
return SomeClass(0);
};
// calls implementation
SomeClass SomeClass::SomeMethod() {
return OSImplementation();
}
Run Code Online (Sandbox Code Playgroud) 我有一个非常非常简单的HTML,通常HTML中的所有内容似乎都应该正常工作,但在这种情况下,它不会.我认为标签的大小应该继承子图像标签.但在下面的情况下,尺寸是不同的.
HTML:
<a href="."><img src="some image"></a>?
Run Code Online (Sandbox Code Playgroud)
CSS:
a {
border: 1px solid #000;
width: auto;
height: auto;
}
img {
border: 1px solid #F00;
}
?
Run Code Online (Sandbox Code Playgroud)
为什么不<a>继承图像的大小?(见:http://jsfiddle.net/49ykj/)
到目前为止,这在Firefox和Chrome中都会发生,所以我假设它发生在所有浏览器中.这是一个错误吗?为什么不应该是一个bug?
我正在为闭包编译器注释我的所有javascript,但是 - 我目前的代码在很大程度上取决于在对象中定义类,即:
Class.SomeClass = function() {};
Class.SomeOtherClass = function() {};
Run Code Online (Sandbox Code Playgroud)
而不是:
function SomeClass() {};
SomeClass.prototype = {};
Run Code Online (Sandbox Code Playgroud)
但是,它在尝试注释扩展时给了我一个警告......编译器声明我无法确定Class.SomeClass是什么类型:
JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type Class.SomeObject
* @extends Class.SomeObject
Run Code Online (Sandbox Code Playgroud)
使用ADVANCED_OPTIMIZATIONS将以下代码粘贴到闭包编译器中:
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==
(function($) {
"use strict";
var Class = {};
/**
* @constructor
*/
Class.ObjectA = function() {};
Class.ObjectA.prototype = {};
/**
* @constructor
* @extends Class.ObjectA
*/
Class.ObjectB = function() {};
Class.ObjectB.prototype = $.extend(new Class.ObjectA(), {
initialize: function() …Run Code Online (Sandbox Code Playgroud) 这是我之前关于在C++中返回引用的问题的后续问题:在c ++中返回对象的最佳方法?
我可以成功返回引用,但是,我无法阻止观察者完全覆盖有问题的变量.我使用了const引用,但我希望观察者能够改变值.
代码如下:
class Layer {
public:
Channel& getChannel();
private:
Channel channel;
};
// return reference to channel
Channel& Layer::getChannel() {
return channel;
};
// FINE
layer.getChannel().someMethod();
// BAD: PRIVATE MEMBER IS OVERWRITTEN
layer.getChannel() = Channel();
Run Code Online (Sandbox Code Playgroud)
现在我很确定要防止这个我必须改变函数的签名才能返回const引用,但是,我someMethod之后无法打电话:
// CHANGE TO CONST REFERENCE
Channel const& Layer::getChannel() {
return channel;
};
// return const ref of channel
Channel const& channel = layer.getChannel();
// ERROR!!
// 'Channel::someMethod' : cannot convert 'this' pointer from 'const Channel' …Run Code Online (Sandbox Code Playgroud) 更多C++学习问题.我一直在使用矢量主要使用原始指针并取得了一定程度的成功,但是,我一直试图使用值对象来代替.我遇到的第一个问题是编译错误.编译下面的代码时出错:
class FileReference {
public:
FileReference(const char* path) : path(string(path)) {};
const std::string path;
};
int main(...) {
std::vector<FileReference> files;
// error C2582: 'operator =' function is unavailable in 'FileReference'
files.push_back(FileReference("d:\\blah\\blah\\blah"));
}
Run Code Online (Sandbox Code Playgroud)
Q1:我假设它是因为某种方式指定了一个const路径,和/或没有定义赋值运算符 - 为什么默认运算符不起作用?在我的对象上定义const甚至我假设它是因为我定义了一个const路径,const甚至在这里赢得了什么?
Q2:其次,在这些值对象的向量中,我的对象是否对内存安全?(意思是,它们会自动删除给我).我在这里读到默认情况下向量被分配到堆 - 所以这意味着我需要"删除"任何东西.
Q3:第三,为了防止复制整个矢量,我必须创建一个参数,将矢量作为参考传递,如:
// static
FileReference::Query(const FileReference& reference, std::vector<FileReference>& files) {
// push stuff into the passed in vector
}
Run Code Online (Sandbox Code Playgroud)
返回大型对象的标准是什么,当函数死亡时我不想死.我可以从这里使用shared_ptr或类似的东西中受益吗?