我正在尝试编写一个实用程序类,允许自动调整tiletale图像的大小.假设有一个srcBitmap,我从中复制一个由Rectangle srcRegion给出的区域.然后我想在目标区域Rectangle destRegion中将该区域粘贴(明智的像素)到另一个名为Bitmap destBitmap的图像中.我知道如何从源中获取区域并将其放入Bitmap对象中,但我还没有找到如何将Bitmap对象实际粘贴到另一个更大的Bitmap对象中的某个区域中.
有快速的方法吗?(没有GDI而没有深入研究位图的字节数组).这是应该澄清我的目标的片段
private static void CopyRegionIntoImage(Bitmap srcBitmap, Rectangle srcRegion, Bitmap destBitmap, Rectangle destRegion)
{
// get the required region from the destination
Bitmap region = Copy(srcBitmap, srcRegion);
}
Run Code Online (Sandbox Code Playgroud) 考虑以下构造:
//! Templated singleton.
/*!
Template wrapper enforcing the singleton behavior.
*/
template <class T>
class TSingleton
{
private:
//! Singleton instance pointer.
static T* instance;
//! private constructor.
TSingleton() { }
//! private empty copy constructor.
TSingleton(const TSingleton<T>& sourceObject) {}
public:
//! Static singleton instance getter.
static T* GetInstance()
{
if (instance == 0)
instance = new T();
return instance;
}
};
template <class T> T* TSingleton<T>::instance = 0;
Run Code Online (Sandbox Code Playgroud)
此模板类和静态实例的定义写在同一个头文件中.对于非模板类,由于为实例静态成员定义了多个符号,因此会导致链接时错误.对于模板来说,这似乎是直观的,因此必须将定义分开并将其放在.cpp文件中.但模板通常在类似头文件中声明和定义.是什么允许此语法对模板类有效且有效?
有关于此的维基百科链接,但它没有提供关于模板类的情况的明确解释.
我有一个std::list<MyObject*> objectList容器,我需要在以下场景中进行排序和维护:
我可以使用任何其他stl容器/机制来允许三种行为属性吗?它几乎像一堆,我认为使用它make_heap可能是一个很好的方式来排序列表.我需要一个指针容器,因为有几个其他数据结构依赖于这些指针.
那么我怎么能选择一个更好的容器,它也是指针友好的,并允许通过查看指向类型的比较运算符进行排序?
澄清:我需要一个最适合该场景的stl容器,并且可以成功地包装指针或引用.(例如,我简要地读到std::set容器可能是一个很好的候选者,但我没有经验).
目前的实施,基于以下答案:
struct SHafleEdgeComparatorFunctor
{
bool operator()(SHEEdge* lhs, SHEEdge* rhs)
{
return (*lhs) < rhs;
}
};
std::multiset<SHEEdge*, SHafleEdgeComparatorFunctor> m_edges;
Run Code Online (Sandbox Code Playgroud)
当然,SHEEdge数据结构有一个重载的运算符:
bool operator<(SHEEdge* rhs)
{
return this->GetCollapseError() < rhs->GetCollapseError();
}
Run Code Online (Sandbox Code Playgroud) 简单地说,如何在C++中为单级继承创建接口(出于简单和教学原因)?我看到一些代码没有使用多态,但基类包含一个虚拟抽象方法(virtual void TheMethod() = 0).
现在,一个类是使用纯虚方法从这个抽象类派生的,但是在后续代码中,派生类的实例在没有动态分配的情况下被使用.
这是正确的方法吗?使用多态设计推断出的开销是多少?
我认为这是不可能的..这看起来更像隐藏/重影基本方法,即使该方法是纯虚方法.
后来编辑:感谢所有设法提供一些好答案的人,我想强调一下由于使用"动态分配"而产生的一个严重错误,强调这个对象创建的可能性是唯一一个兼容多态的.很明显,使用这种运行时调用行为并不是唯一的方法(但也许是最常见的?),但为了进一步澄清我原来的问题:
有没有办法强制程序员在不使用纯虚方法的情况下实现方法?我可能没有道理的关注是,打开多态设计的大门是否在性能方面也有点沉重(每秒钟对讨论中的方法进行数千次这样的调用).
甚至稍后编辑:使基础具有受保护的构造函数意味着它不能直接实例化(除了使用工厂或其他友好方法),这可以解决补偿纯虚方法引起的影响之一.但是如何确保任何派生类仍然提供自己的方法实现?如果对相关vtable的夸大担忧实际上并不是那么重要,那么我将坚持使用纯虚方法(因为SFINAE,奇怪的重复模板模式更难以阅读和理解至少中级C++程序员 - 像我一样:)).
我正在尝试操纵一个特殊的结构,我需要某种混合运算符.为此,有一个重载的数组[]运算符是有意义的,但我不想有任何分支,因为结构的特定规范允许理论上的解决方法.
目前,结构看起来像这样:
struct f32x4
{
float fLow[2];
float fHigh[2];
f32x4(float a, float b, float c, float d)
{
fLow[0] = a;
fLow[1] = b;
fHigh[0] = c;
fHigh[1] = d;
}
// template with an int here?
inline float& operator[] (int x) {
if (x < 2)
return fLow[x];
else
return fHigh[x - 2];
}
};
Run Code Online (Sandbox Code Playgroud)
我可以/应该做些什么来避免分支?我的想法是使用带有整数参数的模板并定义特化,但目前尚不清楚它是否有意义以及该怪物的语法是什么样的.
在任何情况下,我都没有明确地使用float[4]数组来合并这两个(也没有联合技巧).如果你需要一个很好的理由,那是因为它float[2]实际上类似于平台特定的PowerPC配对单曲.普通的Windows编译器不适用于配对的单个,这就是我用float[2]s 替换代码的原因.
使用GreenHills编译器我得到这个程序集输出(这表明分支确实发生):
.LDW31:
00000050 80040000 89 lwz r0, 0(r4)
00000054 2c000000 90 cmpwi r0, …Run Code Online (Sandbox Code Playgroud) In what scenarios can be reinterpret_cast used to cast from a base pointer that's actually a derived instance pointer? (via polymorphism).
Static casts do not work if the inheritance is polymorphic.
I considered this trivial scenario:
class A
{
public:
virtual void Hello()
{
cout<<" A ";
}
virtual int GetType() { return 1; }
};
class B: public A
{
public:
void Hello()
{
cout<< " B ";
}
void Do()
{
cout << " Another method of B"; …Run Code Online (Sandbox Code Playgroud) 我需要创建一个子进程作为我的主进程的套接字侦听器/服务器,我使用此调用来实现目标:
bSuccess = CreateProcessA(NULL,
cmdLineArgs, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
HIGH_PRIORITY_CLASS, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
Run Code Online (Sandbox Code Playgroud)
任何人都可以说明需要做什么才能让子进程的窗口不显示?每次主要的中央进程创建子进程时,都不希望有一个可见的进程窗口.
我编辑的后期编辑:
HWND hWnd = GetConsoleWindow();
if (hWnd != 0)
{
ShowWindow( hWnd, SW_HIDE);
}
Run Code Online (Sandbox Code Playgroud)
在子进程主函数中,但这并不是最好的解决方案,因为窗口仍然会显示几分之一秒.如果有一个子进程,每个进程都有自己的窗口冒泡到屏幕上,它仍然不优雅.是否有任何标志要为编译器设置以产生"无控制台"输出?
我正在使用Visual Studio 2010.
是否可以检查用户何时在模态窗口外单击?我想以某种方式绕过模态逻辑,因为如果窗口没有显示为模态,它将不会显示在活动窗口的顶部,而且,目前,这是正确显示它的唯一方法.我还没有找到合适的方法(因为"停用"事件将不再被触发..)
正如我理解非静态方法的指针,它们对于为某种方法提供别名机制没有用处.例如,拥有一个具有三种方法的对象
class Provider
{
public:
int A(int in);
int B(int in);
int C(int in);
}
Run Code Online (Sandbox Code Playgroud)
和需要指向提供者方法指针的消费者(无论是A,B还是C).有一个控制器向所谓的消费者提供指向3种方法之一的指针,我们可以在使用Provider实例的消费者代码中编写一些东西,并指向A,B或C,这取决于控制器发送的内容.
如果这是C++中非静态方法的指针所能做到的,是否还有一种方法可以为对象的方法提供更"智能"的指针,而无需将对象与该方法指针一起发送给消费者?在肯定的情况下,所谓的成语/机制是什么(甚至一种模拟这种方式的资格作为我感兴趣的答案).
我有一个算法,需要在函数内构建 NxN 矩阵,该函数将返回该矩阵与同样动态构建的 Nx1 向量的乘积。(N 通常为 8 或 9,但对于大于该值的值必须进行概括)。
我正在使用 Eigen 库来执行更复杂的代数运算(最小二乘和其他几个约束问题),因此不能选择切换它。
我对这些函数进行了基准测试,由于密集的内存分配,存在巨大的瓶颈。我的目标是构建一个线程安全的应用程序,因此,在某些情况下,我将这些矩阵和向量替换为对全局向量中元素的引用,该全局向量充当无法存储在堆栈上的对象的提供者。这避免了调用特征矩阵和向量的构造函数/析构函数,但这不是一个优雅的解决方案,如果不小心的话,可能会导致巨大的问题。
因此,Eigen 是否提供了一种解决方法,因为我没有看到将分配器作为这些对象的模板参数传递的选项,或者是否有更明显的事情要做?
此代码仅呈现十二面体并完全忽略该glBegin(GL_TRIANGLES)块:
glutSolidDodecahedron();
glBegin(GL_TRIANGLES);
glNormal3f(1, 0, 0);
glVertex3f(11, 0, 0);
glNormal3f(0, 1, 1);
glVertex3f(-11, 0, 0);
glNormal3f(0, 0, 1);
glVertex3f(0, 0, 11);
glEnd();
Run Code Online (Sandbox Code Playgroud)
这两个着色器非常简单:
顶点着色器:
varying vec3 normal;
void main()
{
gl_Position = ftransform();
gl_FrontColor = gl_Color;
gl_BackColor = gl_Color;
normal = gl_Normal;
normal = gl_NormalMatrix * normal;
}
Run Code Online (Sandbox Code Playgroud)
和碎片:
uniform vec3 lightDir;
varying vec3 normal;
void main()
{
float intensity = dot(lightDir, normal);
gl_FragColor = 0.5 * (1.5 + intensity) * gl_Color;
}
Run Code Online (Sandbox Code Playgroud)
虽然glutSolidX函数类型适用于此示例(基于Lightouse3D教程),但如何快速绘制三角形,从一帧到另一帧更改坐标(我尝试了数组和GL_DYNAMIC_DRAW,但与旧的"固定管道"相比,这工作太多了"方法".我看到其他人仍然 …